Unity Fake Null
유니티 오브젝트는 C++로 작성된 네이티브 객체의 래퍼이다.
Unity 객체는 씬이 변경되거나 Object.Destroy()를 사용하면 제거되지만 그 객체를 C#으로 래핑 한 유니티 오브젝트는 가비지 컬렉터가 수집을 완료할 때까지 남아있게 된다. 실상으로는 모두 다 파괴가 된 상태가 아니라는 이야기이다.
반응형
Unity에서는 이 상태를 “Fake Null”이라고 하고 있습니다.
테스트 케이스인 코드를 확인하게되면 다음과 같다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
IEnumerator Start()
{
BoxCollider col = gameObject.AddComponent<BoxCollider>();
yield return null;
Destroy(col);
yield return null;
CheckUnityObjectNull(col);
CheckSystemObjectNull(col);
}
void CheckUnityObjectNull(Object obj)
{
if (obj == null)
{
Debug.Log("Unity Object is null");
}
else
{
Debug.Log("Unity Object is not null");
}
}
void CheckSystemObjectNull(object obj)
{
if (obj == null)
{
Debug.Log("System Object is null");
}
else
{
Debug.Log("System Object is not null");
}
}
}
Log를 찍어서 보게되면 다음과 같다.
Destroy를 통해서 객체를 제거하는 과정에서 Object라고 하는 래핑 객체는 삭제가 되지만
내부의 닷넷의 오브젝트는 null이 아니다.
그래서 실질적으로 완벽하게 null으로 처리를 하기 위해서는
null으로 변경 이후에 Destory를 처리하게 되면 System object도 null 처리가 된다.
ReferenceEquals와 null과 비교를 통해서 가능하다.
object.ReferenceEquals(obj, null)
Unity의 Null 검사 : [링크]
Unity's Scripting Duality and Object Destruction : [링크]
유니티 오브젝트의 null 비교 시 유의사항 : [링크]
★☆☆☆☆
반응형
'개발 > 기본) 기본기' 카테고리의 다른 글
기본기)의사코드(Pseudo Code ) (0) | 2022.01.13 |
---|---|
기본기) 랜덤 - 의사 난수 발생기 (Pseudo Random Number Generator : PRNG) (0) | 2021.10.27 |
기본기)c#) ?. , ??, ??= 연산자 (0) | 2021.09.28 |
기본기)Event Handler 대리자 (0) | 2021.09.26 |
기본기)c# switch statement on a range(switch 문 범위 조건) (0) | 2021.09.13 |
댓글