Menu
CoddyTech

Null di Unity

Termasuk bagian Dasar-Dasar Scripting Unity dalam perjalanan Unity di Coddy. Pelajaran 46 dari 67.

Object Unity memiliki dua bagian: object C# yang dipegang skripmu dan object engine di baliknya. Destroy(obj) menghapus bagian engine di akhir frame, tetapi variabelmu masih menunjuk ke bagian C#, jadi menurut C# biasa, nilainya bukan null. Unity mengubah perilaku == untuk menangani hal ini: setelah object dihancurkan, obj == null bernilai true, begitu juga pemeriksaan singkat !obj. Inilah fake null milik Unity.

?., ??, dan is null tidak menggunakan == tersebut. Operator-operator ini memeriksa referensi C#, yang masih ada, sehingga pemanggilan tetap dijalankan, dan saat object yang sudah dihancurkan disentuh, muncul MissingReferenceException: The object of type 'Transform' has been destroyed but you are still trying to access it. Label ini menampilkan nama pemimpin balapan, yang bisa tersingkir (dihancurkan):

[SerializeField] private Transform leader;

void Update()
{
    // memunculkan error setelah leader dihancurkan: string shown = leader?.name ?? "nobody";
    string shown = leader != null ? leader.name : "nobody";
    Debug.Log("Leader: " + shown);
}

Untuk apa pun yang berasal dari UnityEngine.Object (GameObject, komponen, skripmu), lakukan pemeriksaan dengan == null, != null, atau if (obj), dan gunakan ?. serta ?? untuk object C# biasa seperti string. Ingat juga bahwa Destroy menunggu hingga akhir frame: sampai saat itu, object masih hidup dan == null bernilai false.

challenge icon

Tantangan

Sedang

Drone mengejar targetnya, dan target dihancurkan 2 detik setelah permainan dimulai. Sejak saat itu, Console dipenuhi MissingReferenceException, karena target?.position tidak mengetahui bahwa target sudah tidak ada.

Perbaiki Update() dengan pemeriksaan null bawaan Unity: selama target masih ada, drone terbang ke arahnya dengan kecepatan speed; setelah dihancurkan, drone tetap di tempatnya, tanpa error.

Tekan Play dan amati Console, perbaiki skrip, lalu tekan Check.

Coba sendiri

using UnityEngine;

public class Chaser : MonoBehaviour
{
    [SerializeField] private Transform target;
    [SerializeField] private float speed = 2f;

    void Start()
    {
        Destroy(target.gameObject, 2f);   // target dihancurkan setelah 2 detik
    }

    void Update()
    {
        Vector3 goal = target?.position ?? transform.position;
        transform.position = Vector3.MoveTowards(transform.position, goal, speed * Time.deltaTime);
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Dasar-Dasar Scripting Unity