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.
Tantangan
SedangDrone 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);
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Dasar-Dasar Scripting Unity
1Skrip Pertamamu
Halo, UnityLetakkan KubusBergerak di Setiap FrameBerputar Setiap DetikKendalikan dengan TombolRingkasan: Kendarai Kubus4Vektor
Menjumlahkan VektorArahRuang Lokal dan DuniaKecepatan DiagonalJarak antara BendaVector3 adalah StructRingkasan: Pilot Drone7Proyek: Tangkap Bintang
Si PenangkapBintang Jatuh5Transformasi dan Hierarki
Objek Induk dan AnakSkalaMenghadap ke ObjekBergerak Menuju TitikRangkuman: Bulan yang Mengorbit8Menemukan Sesuatu
Cari berdasarkan NamaTagCari berdasarkan TipeReferensi Lebih Baik daripada FindNull di UnityRangkuman: Koin Terdekat6GameObject dan Komponen
Referensi di InspectorMendapatkan KomponenKomponen yang HilangMenambahkan KomponenRequireComponentTampilkan dan SembunyikanRangkuman: Sakelar Lampu