Menu
CoddyTech

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

challenge icon

챌린지

중급

대상이 파괴된 후 드론에서 오류가 발생하지 않도록 하세요.

  1. Update()에서 두 줄을 Unity 자체의 null 검사인 if (target != null)로 바꾸세요.
  2. 그 안에 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 플레이그라운드