Menu
CoddyTech

Null di Unity

Termasuk bagian Dasar-Dasar Scripting Unity dalam perjalanan Unity di Coddy. Pelajaran 60 dari 85.

Objek Unity memiliki dua bagian: objek C# yang dipegang skripmu dan objek mesin di baliknya. Destroy(obj) menghapus bagian mesin pada akhir frame, tetapi variabelmu masih menunjuk ke bagian C#, jadi menurut istilah C# biasa, nilainya bukan null. Unity menimpa == untuk menangani hal ini: setelah objek dihancurkan, obj == null bernilai true, begitu juga pengujian singkat !obj. Inilah null palsu milik Unity.

?., ?? dan is null tidak menggunakan == itu. Semuanya menguji referensi C#, yang masih ada, jadi pemanggilan tetap dilakukan, dan mengakses objek yang sudah dihancurkan akan memunculkan 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), uji dengan == null, != null atau if (obj), dan gunakan ?. serta ?? untuk objek C# biasa seperti string. Ingat juga bahwa Destroy menunggu hingga akhir frame: sampai saat itu, objek masih hidup dan == null bernilai false.

challenge icon

Tantangan

Sedang

Hentikan error drone setelah targetnya dihancurkan.

  1. Di Update(), ganti kedua baris dengan if (target != null), pemeriksaan null bawaan Unity.
  2. Di dalamnya, tulis transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime);.

Tekan tombol “Main”: drone mengejar target, lalu menunggu tanpa error di Console. Lalu tekan tombol “Periksa”.

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);
    }
}

Semua pelajaran di Dasar-Dasar Scripting Unity

Latihan sendiri: Playground Unity