Tandre的碎碎念:我开始用Unity做项目接触最早的接口就是Unity的GameObject的SetActive接口,当时甚至只用这一个接口就解决了一个项目中所有关于显示与隐藏的问题,但实际上它的问题很多,很多时候需要尽量避免使用或避免直接使用,这篇博客就记录下关于显示与隐藏的优化问题。

目录

前言

本文已于2024年3月11日被收录至【GitCode 开源社区】 社区,见Unity控制物体显示与隐藏方法及优化总结_unity_Tandre_Z-GitCode 开源社区 (csdn.net),且被列为为CSDN发布日当周社区精选文章

SetActive接口

可以说是最常用的控制显示与隐藏的接口了,但往往并不推荐使用

示例代码

GameObject go
go.SetActive(true);
go.SetActive(false);

问题

1.会导致网格重建,触发Unity的垃圾回收机制(GC),总之很影响性能

2.引起OnEnable和OnDisable的调用,会有一定的消耗

优化方案

因为对于该接口的GC问题很难解决,所以只能尽量的避免。

SetActive在底层会先对物体进行判断是否处于Active状态,而SetActive这个接口在调用时本身就是在C#层调用底层,所以为避免不必要的底层判断,可以在C#层对物体的Active状态进行判断。示例代码如下:

static public class MyTools
{
    public static void MSetActive(this GameObject go, bool State)
    {
        if (go)
        {
            if (go.activeSelf != State)
            {
                go.SetActive(State);
            }
        }
    }
}

写完这样一个方法后,在后续需要设置显示隐藏时只需要调用这个方法

GameObject go;
go.MsetActive(true);

UI的显示隐藏