GetComponents
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 8 dari 50.
GetComponent<T>() mengembalikan kecocokan pertama. GetComponents<T>() mengembalikan semua kecocokan pada object sebagai array, sedangkan GetComponentsInChildren<T>() mengembalikan semua kecocokan pada object dan semua yang berada di bawahnya. Dengan interface sebagai T, satu pemanggilan mengumpulkan setiap bagian yang bisa melakukan sesuatu, apa pun class-nya. Di sini, mesin-mesin pabrik merupakan child dari object Factory, dan setiap bagian yang beroperasi dengan daya mengimplementasikan IPowered:
public interface IPowered
{
void SetPower(bool on);
}public class Generator : MonoBehaviour
{
public GameObject factory;
public void Switch(bool on)
{
IPowered[] parts = factory.GetComponentsInChildren<IPowered>();
foreach (IPowered part in parts)
{
part.SetPower(on);
}
Debug.Log(parts.Length + " parts powered");
}
}Lamp menyalakan Light-nya, Fan mulai berputar, dan Conveyor mulai bergerak, masing-masing melalui SetPower-nya sendiri. Mesin dengan Lamp dan Fan pada satu object dihitung dua kali karena setiap komponen merupakan kecocokan terpisah. Generator tidak pernah menyebut nama mereka, jadi Siren yang mengimplementasikan IPowered dan ditambahkan di bawah Factory nanti akan dinyalakan oleh Switch berikutnya.
GetComponentsInChildren menyertakan object tempat kamu memanggilnya, dan melewatkan child yang tidak aktif kecuali kamu meneruskan true: GetComponentsInChildren<IPowered>(true). GetComponents hanya memeriksa satu object, cocok untuk bagian-bagian yang terpasang berdampingan, seperti lampu dan buzzer pada satu pintu.
Tantangan
MudahRobot latihan harus menampilkan setiap serangan. Health.cs pada Robot menghitung hp, dan tiga bagian dapat bereaksi: Flash pada Head membuatnya merah, Recoil pada Robot menyentakkannya ke belakang, dan Sparks pada Antenna melemparkan percikan. Space menyerang robot dengan kekuatan 1 dan klik menyerangnya dengan kekuatan 2 (Trainer.cs sudah siap). Saat ini, Health hanya memberi tahu bagian kepala.
- Di IHitReaction.cs, deklarasikan sebuah antarmuka
IHitReactiondengan satu method,void React(int damage). - Buat Flash, Recoil, dan Sparks mengimplementasikannya: method masing-masing menjadi
React(int damage). Flash melakukan hal yang sama seperti sebelumnya. Recoil menyentakkan robot ke belakang sejauh 0.5 unit (+z) per poin kerusakan, dan Sparks melemparkan satu percikan per poin kerusakan. - Di dalam
TakeDamagemilik Health, setelah hp berkurang, panggilReact(amount)pada setiap IHitReaction di Robot dan anak-anaknya, yang ditemukan dengan satu pemanggilan GetComponentsInChildren, lalu catat jumlah yang bereaksi sebagaiReactions: 3.
Tekan Play, serang robot dengan Space dan klik, lalu tekan Check.
Coba sendiri
using UnityEngine;
public class Health : MonoBehaviour
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
GetComponentInChildren<Flash>().Show();
}
}
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