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.
Tantangan
SedangHentikan error drone setelah targetnya dihancurkan.
- Di
Update(), ganti kedua baris denganif (target != null), pemeriksaan null bawaan Unity. - 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
1Dasar-Dasar C# di Unity
Halo, UnityVariabelDesimal Memerlukan fTeks di ConsoleVariabel yang Menyimpan NilaiIf dan ElseBandingkan AngkaUlasan: Pengumpul Koin7Perulangan dan method
Ulangi dengan forPerulangan di dalam perulanganTulis methodMethod yang Mengembalikan NilaiarrayUlasan: Tangga10Menemukan Benda
Cari Berdasarkan NamaTagCari Berdasarkan TipeReferensi Lebih Baik daripada FindNull di UnityRangkuman: Koin Terdekat13Proyek: Hindari Balok
Karakter PelariBalok dari Langit2Buat Bergerak
Tempatkan KubusBergerak Setiap FrameBerputar Setiap DetikKemudikan dengan TombolRangkuman: Kemudikan Kubus5Vektor
Menjumlahkan VektorArahRuang Lokal dan DuniaKecepatan DiagonalJarak AntarobjekVector3 adalah StructRangkuman: Pilot Drone8GameObjects dan Komponen
Referensi di InspectorAmbil KomponenKomponen yang HilangTambahkan KomponenRequireComponentTampilkan dan SembunyikanRingkasan: Sakelar Lampu6Transformasi dan Hierarki
Objek Induk dan AnakKibarkan BenderaSkalaMelihat BendaBergerak Menuju TitikRekap: Bulan yang MengorbitLatihan sendiri: Playground Unity