개발블로그
[유니티 C#] Destroy와 DestroyImmediate 의 차이점 본문
Destroy 와 DestroyImmediate 는 모두 객체를 제거하는 메소드이다.
모두 객체를 제거하는 메소드임에는 다름이 없지만 상황에 따라서 다르게 사용해야 할 때가 있다.
(유니티에서는 DestroyImmediate 보단 Destroy 사용을 권장한다.)
예제코드를 보자.
public class GameManager : MonoBehaviour
{
public static GameManager Instance { get; private set; }
void Awake()
{
if (Instance == null)
{
Instance = this;
}
else
{
DestroyImmediate(Instance.gameObject);
Instance = this;
}
}
}
게임의 전반적인 시스템 관리를 위한 GameManager 클래스를 생성하고,
싱글턴 클래스로 사용하기 위해서 public static 으로 GameManager형 Instance를 프로퍼티로 선언했다.
스크립트가 실행되면 Awake() 에서 Instance가 null인지 확인한다.
만약 Instance가 null 이라면 GameManager를 Instance에 넣어주고,
null이 아니라면 DestroyImmediate(Instance.gameObject); 를 실행한다.
그렇다면 왜 Destroy를 사용하지 않고 DestroyImmediate를 사용했는지 의문을 가질 수 있다.
// Destroy
public static void Destroy(Object obj);
public static void Destroy(Object obj, [DefaultValue("0.0F")] float t);
// DestryImmediate
public static void DestroyImmediate(Object obj);
public static void DestroyImmediate(Object obj, [DefaultValue("false")] bool allowDestroyingAssets);
두 함수 모두 UnityEngine.Object 부모클래스를 상속 받는다.
1)
Destroy는 GameObject, Component, Asset을 파괴할 수 있다.
GameObject의 경우 GameObject가 파괴된 후 연결된 컴포넌트와 transform 아래로 있는 자식들이 파괴된다.
실제 객체 파괴는 항상 현재 Update 루프가 끝나기 전 해당프레임의 마지막에 렌더링이 되기 전 파괴된다.
2)
하지만 DestroyImmediate는 객체 obj를 즉시 파괴한다.
그리고 이 함수는 영구적으로 Asset을 파괴하므로 사용할 때 주의해야한다.
Destroy와 DestroyImmediate의 차이는 파괴 시점이다.
Destroy는 Update 프레임이 끝나야 파괴 되기 때문에
Update 프레임 내에서 파괴한 객체를 다시 불러도 해당 객체는 null이 아니다.
DestroyImmediate는 불린 즉시 객체가 파괴되기 때문에 해당 객체는 null이 된다.그렇기 때문에 다시 부르면 null 참조 예외가 발생한다.
다시 코드를 보자.
void Awake()
{
if (Instance == null)
{
Instance = this;
}
else
{
DestroyImmediate(Instance.gameObject);
Instance = this;
}
}
Awake()함수에서 만약 Instance가 null이 아니라면 현재 Instance가 존재하고 있다는 뜻이다.
현재 가지고 있는 Instance가 어떤 것인지 모르니
Update 함수가 돌기 전에 즉시 삭제하고 this(GameManager) 를 대입해줘야한다.
* 공부하는 단계입니다. 잘못된 정보가 있다면 피드백 부탁드립니다😊
* e-mail : heehee970@naver.com
'Unity > 스크립팅' 카테고리의 다른 글
[유니티 C#] Action 과 Func (0) | 2021.09.04 |
---|---|
[유니티 C#] 유니티의 시간 마법사 Time.timeScale, 그리고 Time.unscaledTime (0) | 2021.08.11 |
[유니티 C#] Time.deltaTime, Application.targetFrameRate을 통한 프레임 제어 (0) | 2021.08.04 |
객체 지향 프로그래밍(OOP)에서의 클래스 개요. 변수와 프로퍼티의 차이 (0) | 2021.08.02 |
[유니티 C#] 함수 대리자. 델리게이트 (Delegate), 이벤트(event) (0) | 2021.08.02 |