什么时候才是UnusedAssets?
看一个例子:
Object obj = Resources.Load("MyPrefab");
GameObject instance = Instantiate(obj) as GameObject;
.........
Destroy(instance);
创建随后销毁了一个Prefab实例,这时候 MyPrefab已经没有被实际的物体引用了,但如果这时:
Resources.UnloadUnusedAssets();
内存并没有被释放,原因:MyPrefab还被这个变量obj所引用
这时候:
obj = null;
Resources.UnloadUnusedAssets();
这样才能真正释放Assets对象
所以:UnusedAssets不但要没有被实际物体引用,也要没有被生命周期内的变量所引用,才可以理解为 Unused(引用计数为0)
所以所以:如果你用个全局变量保存你Load的Assets,又没有显式的设为null,那 在这个变量失效前你无论如何UnloadUnusedAssets也释放不了那些Assets的。如果你这些Assets又不是从磁盘加载的,那除了 UnloadUnusedAssets或者加载新场景以外没有其他方式可以卸载之。
亲测:只是在编辑器中进行了Load一个Prefab,查看是否可以在没有引用的时候卸载掉,答案是在编辑器中有时候是可以的,因为可能编辑器的测试环境会加了一些无用的引用,可能会导致卸载不了。 但如果new一个新的场景测试的话,是可行的。
void Start()
{UnityEngine.Object obj = Resources.Load ("Cube");
GameObject ins = Instantiate (obj) as GameObject;
StartCoroutine(Test(ins));
}
IEnumerator Test(GameObject ins)
{
yield return new WaitForSeconds (5f);
Destroy (ins);
Debug.LogError ("222");
Resources.UnloadUnusedAssets ();
}