Unity의 Null
Coddy Unity 여정의 Unity 스크립팅 기초 섹션에 포함된 레슨. 85개 중 60번째.
Unity 객체는 두 부분으로 이루어져 있습니다. 스크립트가 참조하는 C# 객체와 그 뒤에 있는 엔진 객체입니다. Destroy(obj)는 프레임이 끝날 때 엔진 객체를 제거하지만, 변수는 여전히 C# 객체를 가리키므로 일반적인 C# 기준으로는 null이 아닙니다. Unity는 이를 처리하기 위해 ==를 재정의합니다. 객체가 파괴되면 obj == null은 true가 되고, 간단한 검사인 !obj도 마찬가지입니다. 이것이 Unity의 가짜 null입니다.
?., ??, is null은 ==를 사용하지 않습니다. 이 연산자들은 여전히 존재하는 C# 참조를 검사하므로 호출을 그대로 진행시키며, 파괴된 객체에 접근하면 MissingReferenceException: The object of type 'Transform' has been destroyed but you are still trying to access it.이 발생합니다. 이 라벨은 레이스에서 탈락할 수 있는(파괴될 수 있는) 선두 주자의 이름을 표시합니다.
[SerializeField] private Transform leader;
void Update()
{
// leader가 파괴되면 예외가 발생함: string shown = leader?.name ?? "nobody";
string shown = leader != null ? leader.name : "nobody";
Debug.Log("Leader: " + shown);
}UnityEngine.Object에서 비롯된 객체(GameObject, 컴포넌트, 스크립트)에는 == null, != null 또는 if (obj)로 검사하고, 문자열 같은 일반 C# 객체에는 ?.와 ??를 사용하세요. 또한 Destroy는 프레임이 끝날 때까지 기다린다는 점을 기억하세요. 그때까지 객체는 여전히 살아 있으며 == null은 false입니다.
챌린지
중급대상이 파괴된 후 드론에서 오류가 발생하지 않도록 하세요.
Update()에서 두 줄을 Unity 자체의 null 검사인if (target != null)로 바꾸세요.- 그 안에
transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime);를 작성하세요.
‘플레이’를 누르세요. 드론이 대상을 쫓다가 Console에 오류 없이 멈춥니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using UnityEngine;
public class Chaser : MonoBehaviour
{
[SerializeField] private Transform target;
[SerializeField] private float speed = 2f;
void Start()
{
Destroy(target.gameObject, 2f); // target은 2초 후에 파괴됩니다
}
void Update()
{
Vector3 goal = target?.position ?? transform.position;
transform.position = Vector3.MoveTowards(transform.position, goal, speed * Time.deltaTime);
}
}
Unity 스크립팅 기초의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드