You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity销毁GameObject后如何自动将Transform引用置空?

为什么Unity销毁GameObject后,关联的Transform引用会自动置空?

场景对比

Unity引擎对象场景

执行以下代码:

public class Test : MonoBehaviour
{
    Transform tf = null;
    GameObject go = null;
    // Start is called before the first frame update
    void Start()
    {
        go = new GameObject();
        tf = go.transform;
        DestroyImmediate(go);
    }
    float t = 0;
    // Update is called once per frame
    void Update()
    {
        t += Time.deltaTime;
        if(t > 2)
        {
            Debug.Log(go);
            Debug.Log(tf);
        }
    }
}

运行后会发现,2秒后go和tf的打印结果都是null,但tf原本是指向go.transform的强引用。

普通C#对象场景

再看纯C#对象的情况:

public class Test : MonoBehaviour
{
    class A
    {

    }
    class B
    {
        public A a = new A();
    }
    A a = null;
    B b = null;
    // Start is called before the first frame update
    void Start()
    {
        b = new B();
        a = b.a;
        b = null;
        GC.Collect(); //clear object b
    }
    float t = 0;
    // Update is called once per frame
    void Update()
    {
        t += Time.deltaTime;
        if(t > 2)
        {
            Debug.Log(b);//null
            Debug.Log(a);//not null
        }

    }
}

这里b被置空并触发GC后,a依然持有对A对象的强引用,打印结果不为null,符合标准.NET引用语义。

核心疑问

已知Unity底层由C实现,既然C#本身无法手动删除对象或批量置空引用,那C层是如何在销毁内存后,将所有指向该内存的C#引用置空的?

原理解析

Unity中的GameObject、Transform等继承自UnityEngine.Object的对象,并非纯C#托管对象,而是C++实体 + C#包装器的双层结构:

  • C#侧的UnityEngine.Object子类实例,内部存储着一个指向C底层对象的原生指针,同时C引擎会维护一个反向列表,记录所有关联到该C++对象的C#包装器实例。
  • 当调用DestroyImmediate(go)时,C++层会先销毁对应的GameObject和Transform实体,随后遍历所有关联的C#包装器,将它们内部的原生指针置为null,并标记这些包装器为"已销毁"状态。
  • 当你在C#侧访问这些包装器(比如打印tf)时,Unity重载的相等判断、ToString方法以及Debug输出逻辑,都会先检查内部的原生指针是否有效,一旦发现无效就会表现出"等同于null"的行为(实际上C#包装器对象本身还没被.NET GC回收,只是内部状态失效了)。

而普通C#对象完全由.NET GC管理,没有C++层的介入,只有当对象的所有强引用都被移除后,GC才会在合适时机回收它,不存在任何机制能主动批量置空指向某个对象的所有引用——这是标准的.NET内存管理逻辑。

内容的提问来源于stack exchange,提问作者SZYoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:12:36