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

Unity销毁GameObject后普通类实例未释放的原因咨询

Unity中GameObject销毁后普通类实例未释放的原因分析

核心逻辑:Unity销毁标记≠CLR对象回收

当你销毁GameObject时,Unity仅将关联的Test MonoBehaviour标记为已销毁(不可用),并不会立刻从.NET托管堆中移除该MonoBehaviour实例。此时该MonoBehaviour的List成员依然持有对TestClass实例的强引用,而MonoBehaviour自身仍被Unity内部的对象管理系统持有引用——这就导致CLR的GC无法判定这些对象为可回收状态,自然不会触发TestClass的析构函数。

为什么手动调用GC.Collect()无效?

GC回收的前提是对象没有任何存活的强引用。此时被标记为销毁的MonoBehaviour仍在Unity的内部引用链中(比如场景的销毁对象缓存),CLR扫描时会认为该对象仍被使用,因此不会回收它,连带它引用的所有普通类实例也无法被释放。

这不是Unity Bug,是设计机制

Unity的UnityEngine.Object体系与.NET托管对象体系是并行运作的:

  • Unity负责管理场景/资源对象的生命周期(激活、销毁、序列化等),销毁操作只是标记对象状态,并非立刻释放内存
  • .NET GC仅负责托管堆的内存回收,只有当对象的**所有强引用(包括Unity内部的引用)**都被解除后,才会触发回收

关于释放操作的说明

在OnDestroy中手动清空List是Unity开发中的常规最佳实践:

  • 主动解除托管对象的强引用,能让GC及时回收这些实例,避免内存占用延迟释放
  • 若依赖Unity自动清理,需等待Unity内部完成对MonoBehaviour实例的引用解除,这个时机不可控,可能导致短期内存占用偏高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:45:33