我有一個實例化場景層次結構中的幾個統一遊戲對象的類。這個類實現了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