Menu
CoddyTech

Unity의 Null

Coddy Unity 여정의 Unity 스크립팅 기초 섹션에 포함된 레슨. 67개 중 46번째.

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입니다.

challenge icon

챌린지

중급

드론은 대상을 쫓고, 대상은 게임 시작 2초 후에 파괴됩니다. 그때부터 Console에 MissingReferenceException이 계속 표시됩니다. target?.position이 대상이 사라진 것을 감지하지 못하기 때문입니다.

Unity 자체의 null 검사를 사용해 Update()를 수정하세요. 대상이 존재하는 동안 드론은 speed의 속도로 대상을 향해 날아갑니다. 대상이 파괴되면 드론은 오류 없이 그 자리에 멈춰 있습니다.

Play를 눌러 Console을 확인하고, 스크립트를 수정한 다음 Check를 누르세요.

직접 해보기

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);
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Unity 스크립팅 기초의 모든 레슨