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

相关推荐
寂寞的船18 小时前
【Unity知识速递】第13期 Unity 内存泄漏排查实战:从 Memory Profiler 到 Lua 引用泄漏的生产级全链路诊断
unity·junit·c#·游戏引擎·lua
寂寞的船1 天前
【Unity Bug挑战】第12期 Awaitable 二次 await 死锁之谜 —— 为什么同一个异步操作等两次就卡死?
unity·c#·游戏引擎·bug
探求虚无3 天前
用 AI 在 Unity 里做一款 RTS:最难的不是生成代码,而是证明它真的能玩
人工智能·unity·游戏引擎
17岁的勇气4 天前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
寂寞的船5 天前
【Unity知识速递】第10期 Unity GC 零分配实战:从 UnityEngine.Pool 到手动 GC 控制的全链路优化
jvm·unity·c#·游戏引擎·lucene
寂寞的船7 天前
【Unity知识速递】第8期 IL2CPP 托管堆内存碎片与原生堆交互机制深度解析
unity·游戏引擎·交互
寂寞的船8 天前
【Unity知识速递】第5期 Unity 6.2 深度解析:AI Assistant 登场,World Space UI 与 Sentis 全面升级
人工智能·ui·unity
寂寞的船8 天前
【Unity知识速递】第4期 MCP for Unity:用 AI 自然语言控制编辑器
人工智能·unity·编辑器
淡海水8 天前
09-04-内存-Unity原生对象生命周期
unity·c#·游戏引擎·gc
寂寞的船8 天前
【Unity知识速递】第6期 URP性能优化完全指南:从内存到GPU的三维调优
unity·性能优化·编辑器