使用MonoBehaviour自动释放资源的一个问题

先说个结论。在Unity里,用MonoBehaviour去实现资源的自动释放是不可行的。

事情的起因是这样的,游戏界面中需要根据逻辑去设置图标。图标不是直接拼在界面上的,需要动态加载。既然是动态加载的,就必定涉及到资源释放。我的想法很简单,在MonoBehaviour的OnDestroy中进行资源释放。但是游戏运行时,资源依然没有正确释放。于是我对MonoBehaviour的生命周期进行了测试。以下是示意代码:

AutoRelease.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class AutoRelease : MonoBehaviour
{
private void Awake()
{
Debug.Log("AutoRelease Awake");
}

private void Start()
{
Debug.Log("AutoRelease Start");
}

private void OnDestroy()
{
Debug.Log("AutoRelease OnDestroy");
}
}

AutoReleaseTest.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class AutoReleaseTest : MonoBehaviour
{

public GameObject prefab;
public GameObject parent;

private GameObject newObject;
int frameNum = 0;
void Start()
{
newObject = GameObject.Instantiate<GameObject>(prefab, parent.transform);
newObject.AddComponent<AutoRelease>();
}

void Update()
{
frameNum++;
if (frameNum == 100)
{
GameObject.Destroy(newObject);
newObject = null;
}
}
}

代码逻辑很简单,根据Prefab实例化一个物体,将它创建在parent节点下。经过100帧之后,删除它。接着,我们造一个测试用例。

场景示例

一切准备就绪,点击运行。Prefab启动后出现在Cube节点下,经过100帧后消失。表现完全符合我们的预期。可是Console里却是空空如也。

大家可以按照我文中的例子自己动手尝试。我的环境是Unity2020.3.9

贴一下我的知乎地址,欢迎大家来讨论。点击前往