함수 선언

public static void Destroy ( obj , t = 0.0F);

  • UnityEngine.object Obj : 삭제할 object
  • [DefaultValue("0.0F")] float t : 해당 시간이 지난 이후 삭제, 기본값일 경우(= 0.0) 현재 Update Loop가 끝난 후 삭제된다. 

사용

    public void OnMouseUp()
    {
        Destroy(this.gameObject);
    }

Node 오브젝트들에 해당 함수를 구현하고 사용하고 오브젝트 클릭시, 다음과 같이 삭제됨을 확인할 수 있었다.

클릭한 오브젝트가 삭제됨

  • Destroy() 함수가 호출될 시, OnDisable()과 OnDestroy()가 호출된다.
    • 삭제시 수행할 작업이 있다면 해당 함수를 구현하여 처리할 수 있다.
public void OnMouseUp()
{
	Debug.Log("Call Destroy Function");
	Destroy(this.gameObject);
	Debug.Log("Call Destroy Function End");
}

public void OnDestroy()
{
	Debug.Log("OnDestroy");
}

public void OnDisable()
{
	Debug.Log("OnDisable");
}

위 방식으로 실행한 결과 Log

주의 사항

  • 스크립트 내부에서 Destroy(this) 로 삭제를 구현할시 해당 클래스, 즉 스크립트만 삭제됨을 확인할 수 있다.

이렇게 되어버린다

  • 게임오브젝트를 다른 곳에서 리스트에 넣어서 관리하고 있었을 때, 삭제 후 해당 오브젝트를 관리할떄 조심해야 한다
    • GameObject로 비교 시 null값이 나오지만, object로 비교시에는 GC가 메모리를 초기화해주기 전까지 null값이 나오지 않는다.(Fake NULL 이슈)
Debug.Log("Check!");

if ((GameObject)NodeBoard[0, 0] == null)
	Debug.Log("Null GameObject Found!!!");
if ((object)NodeBoard[0, 0] == null)
	Debug.Log("Null Object Found!!!");
if (!NodeBoard[0, 0])
	Debug.Log("Null by BOOLcheck Found!!!");
    
Debug.Log("Check End!");

삭제 이후 Log, object 비교는 실패한다.

  • 같은 이유로, 소멸자도 삭제 이후에 따로 출력된다.

4초 후 호출된 소멸자

같이보기

https://docs.unity3d.com/ScriptReference/Object.Destroy.html

 

Unity - Scripting API: Object.Destroy

The object obj is destroyed immediately after the current Update loop, or t seconds from now if a time is specified. If obj is a Component, this method removes the component from the GameObject and destroys it. If obj is a GameObject, it destroys the GameO

docs.unity3d.com

 

NOTE

  • Fake Null 이슈에 관해서는 더 깊게 정리해둘 필요가 있을 듯.

 

'Programming > Unity' 카테고리의 다른 글

유니티 코루틴 / Unity Coroutine  (0) 2022.03.11

+ Recent posts