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,不知道别人用完没有。那么还是要把对象池化管理,引用计数。

相关推荐
每日出拳老爷子1 天前
【VR】【Unity】抓走转放系列21|一天搭完门和抽屉工具槽:小场景按这个次序拼装
unity·vr·驱动·排错·snap zone
淡海水2 天前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
小贺儿开发2 天前
Unity 文物新生 会讲故事的文物展墙
人工智能·科技·unity·ai·视频·互动·演示
淡海水2 天前
02-03-原理篇-大对象堆
unity·c#·游戏引擎·.net·gc
WarPigs3 天前
Unity在Create菜单添加创建自定义脚本模板选项
unity
淡海水3 天前
02-01-原理篇-Mark-Sweep与变种算法
算法·unity·c#·游戏引擎·.net·gc
babywang03 天前
Unity笔记--塔防游戏中的ECS架构:从原理到实战的全面解析
unity·ecs架构
babywang04 天前
Unity笔记--AssetBundle详解
unity·游戏引擎
淡海水4 天前
01-04-认知篇-Unity内存全景
unity·c#·游戏引擎·.net·gc