我有一个实例化场景层次结构中的几个统一游戏对象的类。这个类实现了IDisposable。我应该如何管理这些游戏对象,因为它们是托管资源还是非托管资源?Unity游戏对象是托管还是非托管资源?
我正在关注Dispose pattern,所以我应该在哪里放置类似GameObject.Destroy(myGameObject)的调用?
谢谢
编辑: 好吧,让说,我想,当它超出范围摧毁这个类实例化的游戏对象。你将如何继续?
编辑2: 我正在测试处置。我发现解决方案。它不会自动工作,因为GameObject.Destroy(myGameObject)不能从不同的线程调用。它会抛出一个错误CompareBaseObjectsInternal。所以,当不再需要时,我打电话myClass.Dispose()。此外,我是否将Unity GameObject作为托管或非托管来处理似乎并不重要。
myMain()
{
DisposeTestClass test = new DisposeTestClass();
//...
test.Dispose();
}
class DisposeTestClass : System.IDisposable
{
public GameObject uselessGameobject { get; private set; }
public DisposeTestClass()
{
uselessGameobject = new GameObject("Useless gameobject");
}
#region IDisposable
private bool _disposed;
~DisposeTestClass()
{
Debug.Log("~DisposeTestClass()");
this.Dispose(false);
}
public void Dispose()
{
Debug.Log("Dispose()");
this.Dispose(true);
System.GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
Debug.Log("Dispose(bool)");
if(_disposed)
{
Debug.Log("Disposed. Return.");
return;
}
if(disposing)
{
Debug.Log("Disposing of managed resources...");
// clean up managed resources
/*
if(uselessGameobject != null)
{
GameObject.Destroy(uselessGameobject);
Debug.Log("Game object destroyed.");
}
else
{
Debug.Log("Game object is null.");
}*/
}
Debug.Log("Cleaning up unmanaged resources...");
// clean up unmanaged resources
if(uselessGameobject != null)
{
GameObject.Destroy(uselessGameobject);
Debug.Log("Game object destroyed.");
}
else
{
Debug.Log("Game object is null.");
}
// set the flag
Debug.Log("Setting the disposed flag.");
this._disposed = true;
}
#endregion
}
}
那实际上这个类不是一个容器。它只是引用场景中的游戏对象。甚至在班级不再这样的情况下,他们仍然存在。看我的编辑。 – rluks
我刚刚使用“容器”,因为缺乏上下文。在Unity中销毁使用GameObject.Destroy。即使在那之后,除非GC收集它,内存可能仍然会被gameobject占用。无论是IDisposable都不会帮助您完全删除对象。它的目的是释放非托管资源。 GameObject不是非托管资源,因此它不需要IDisposable。 继续存在意味着在现场可见? –
是的,这些gameobjects留在层次结构的场景中。 – rluks