Unity对象不应该使用null传播的问题

为什么

unity重写了==null,不管C#层或C++层对象被销毁都是true。?.则只能判断C#层是不是null,使用则对象被销毁后还是会执行。

cs 复制代码
public class Null传播测试:MonoBehaviour
{
    private void Start()
    {
        StartCoroutine(DO());
    }
    IEnumerator DO()
    {
        GameObject go = new GameObject("和");
        Destroy(go);
        yield return null;
        go?.transform.Translate(Vector3.left);
    }
}

怎么办

想用?.因为这个对象访问链很长,多写一遍加很多代码。

那么如果因为访问链代码长,可以弄全局访问点,让if代码量可接受。

对Object扩展方法?

cs 复制代码
public static class TryDoExt
{
    public static void Try(this UnityEngine.Object obj,
        Action action)
    {
        if (obj != null)
        {
            action?.Invoke();
        }
    }
}

发现很长的访问链要写2遍,比if根本没有优势。

要么把目标类的方法封装扩展方法,那么n个方法要封装n个扩展方法。

思考

一个对象,被两个变量引用着,然后Destroy它的go,假如变量引用的是地址,那两个变量不知道自己引用的对象已经被销毁了,在C#里

cs 复制代码
public class Null传播测试 : MonoBehaviour
{
    private void Start()
    {
        StartCoroutine(DO());
    }
    IEnumerator DO()
    {
        GameObject go = new GameObject("和");
        Destroy(go);
        yield return null;
        //go?.transform.Translate(Vector3.left);
        Debug.Log(ReferenceEquals(go, null));
    }
}

并不知道那个对象被销毁。在C#里销毁对象是把所有引用=null后由垃圾回收。在Unity里是通过判断原生C++对象为null知道已销毁。

那么我们好像能明白C++复杂在哪里了。一个对象,x个变量在引用它,哪里都不敢delete,不知道别人用完没有。那么还是要把对象池化管理,引用计数。

相关推荐
小贺儿开发5 小时前
《长征 · 征途》Unity 三维互动沙盘
科技·3d·unity·1024程序员节·地形·互动·沙盘
上班摸鱼下班游戏7 小时前
Unity 仿生智能算法 从蚁群算法 开始
算法·unity·游戏引擎
Wanda121410 小时前
机器人与机电一体化3D数字孪生机器-Day6
unity·机器人·数字孪生·1024程序员节
淡海水15 小时前
07-03-源码-.NET Core GC标记与扫描
unity·c#·.netcore·gc
上班摸鱼下班游戏1 天前
从零开始玩转 DOTween
unity·游戏引擎
阿松爱学习1 天前
【Unity开发】Unity长截图功能实现
unity·c#·游戏引擎
小小数媒成员1 天前
Rect Transform
游戏·unity·游戏引擎
淡海水1 天前
07-01-源码-.NET Core GC总览与架构
unity·架构·c#·.netcore·gc
淡海水3 天前
06-03-源码-时间分片与调度策略
unity·c#·gc
五仁烧饼3 天前
动手学 Shader Graph(二):溶解与边缘发光
游戏·unity·shader·shader graph