У меня есть класс, который создает несколько объектов игры единиц в иерархии сцены. Этот класс реализует IDisposable. Должен ли я обрабатывать эти игровые объекты, поскольку они были управляемыми или неуправляемыми ресурсами?Доступны ли управляемые или неуправляемые ресурсы игровых объектов Unity?
Я следую за Dispose pattern, поэтому, где я должен поставить вызовы, подобные GameObject.Destroy (myGameObject)?
Спасибо
Edit: Ok, позволяет сказать, что я хочу, чтобы уничтожить игровые объекты, экземпляры этого класса, когда он выходит из области видимости. Как вы тогда начнете?
Редактировать 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 не собирает ее. Любой IDisposable не поможет вам полностью удалить объект. Цель состоит в том, чтобы освободить неуправляемые ресурсы. GameObject не является неуправляемым ресурсом, поэтому для него не требуется IDisposable. Продолжить существование означает видимое на сцене? –
Да, эти игровые объекты остаются в сцене в иерархии. – rluks