Antarmuka dan TryGetComponent
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 7 dari 50.
TryGetComponent meminta sebuah komponen dan memberi tahu kamu apakah komponen itu ditemukan, dalam satu pemanggilan. Fungsi ini juga bisa digunakan dengan interface, sehingga biasanya digunakan untuk menanyakan apakah objek yang kamu sentuh bisa menerima damage. Mine ini melukai semua objek di sekitarnya yang mengimplementasikan IDamageable:
public class Mine : MonoBehaviour
{
public float radius = 3f;
public int damage = 5;
void OnTriggerEnter(Collider other)
{
foreach (Collider c in Physics.OverlapSphere(transform.position, radius))
{
if (c.TryGetComponent(out IDamageable target))
{
target.TakeDamage(damage);
}
}
Destroy(gameObject);
}
}out IDamageable target mendeklarasikan variabel di dalam pemanggilan. TryGetComponent mengembalikan true dan mengisi target jika object memiliki komponen yang mengimplementasikan IDamageable; jika tidak, fungsi ini mengembalikan false dan target bernilai null. Fungsi ini hanya memeriksa satu object itu, tidak pernah parent atau child-nya.
GetComponent melaporkan class yang tidak ditemukan dan interface yang tidak ditemukan dengan cara berbeda. Di Editor, GetComponent<Rigidbody>() pada object tanpa Rigidbody mengembalikan null palsu milik Unity: == null bernilai true, tetapi ?. tidak mengenalinya dan pemanggilan itu menimbulkan MissingComponentException. Interface tidak memiliki null palsu: GetComponent<IDamageable>() mengembalikan null C# yang sebenarnya, jadi == null dan ?. sama-sama berfungsi untuknya. TryGetComponent menghindari persoalan ini untuk keduanya, dan tidak mengalokasikan apa pun di Editor saat komponen tidak ditemukan.
Tantangan
MudahMenara laser berputar dengan tombol panah kiri dan kanan, dan Space memanggil Fire() di Laser.cs. Tulis Fire. Luncurkan ray dari menara ke arah depannya, sepanjang range unit (Inspector mengatur nilainya ke 10), lalu:
- Jika ray mengenai sesuatu yang memiliki IDamageable, panggil
TakeDamage(damage)padanya dan catatHitserta nama object tersebut, sepertiHit Robot. - Jika benda tersebut tidak memiliki IDamageable tetapi memiliki Rigidbody, dorong benda itu dengan
AddForce(transform.forward * push, ForceMode.Impulse)dan catatPushedserta namanya. - Jika tidak termasuk keduanya, catat
Blocked bydan namanya, sepertiBlocked by Pillar. Ray yang tidak mengenai apa pun mencatatMissed.
Gunakan TryGetComponent untuk kedua pencarian. IDamageable.cs, Robot.cs, dan Balloon.cs sudah siap. Tekan Play dan tembak ke segala arah, lalu tekan Check.
Coba sendiri
using UnityEngine;
using UnityEngine.InputSystem;
public class Laser : MonoBehaviour
{
public float range = 10f;
public int damage = 1;
public float push = 5f;
public float turnSpeed = 90f;
private InputAction moveAction;
void Start()
{
moveAction = InputSystem.actions.FindAction("Move");
}
void Update()
{
float turn = moveAction.ReadValue<Vector2>().x;
transform.Rotate(0f, turn * turnSpeed * Time.deltaTime, 0f);
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
Fire();
}
}
void Fire()
{
// Pancarkan sinar ke depan sepanjang range satuan, lalu tangani objek yang terkena
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja SamaRingkasan: Turret Modular5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaGelombang sebagai DataUlasan: database Item8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearest