GetComponents
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 9 dari 64.
GetComponent<T>() mengembalikan kecocokan pertama. GetComponents<T>() mengembalikan setiap kecocokan pada object sebagai array, sedangkan GetComponentsInChildren<T>() mengembalikan setiap kecocokan pada object dan semua object di bawahnya. Dengan interface sebagai T, satu pemanggilan mengumpulkan setiap bagian yang dapat melakukan sesuatu, apa pun class-nya. Di sini, mesin-mesin di sebuah pabrik merupakan anak dari object Factory, dan setiap bagian yang berjalan 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 yang 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 melewati anak-anak yang tidak aktif kecuali kamu memberikan true: GetComponentsInChildren<IPowered>(true). GetComponents hanya memeriksa satu object, cocok untuk bagian-bagian yang berdampingan, seperti lampu dan buzzer pada satu pintu.
Tantangan
MudahBiarkan setiap bagian robot menunjukkan saat terkena serangan.
- Di
IHitReaction.cs, deklarasikanpublic interface IHitReactiondenganvoid React(int damage);. - Buat
Flash,Recoil, danSparksmengimplementasikannya: ubah nama setiap method menjadipublic void React(int damage). - Recoil bergerak mundur sejauh
0.5f * damage, sedangkan Sparks mengeluarkandamagepercikan. - Di
TakeDamage, panggilReact(amount)pada setiapGetComponentsInChildren<IHitReaction>(), lalu catatReactions: 3(jumlahnya).
Tekan tombol “Main”, tekan Space, lalu klik. Setelah itu, tekan tombol “Periksa”.
Coba sendiri
using UnityEngine;
public class Health : MonoBehaviour
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
GetComponentInChildren<Flash>().Show();
}
}
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja BersamaRangkuman: Turret ModularRangkuman: Meriam Kembar4Data yang Diserialisasi
Class yang Dapat DiserialisasiList di InspectorEnum di InspectorRangkuman: Tabel LootRangkuman: Acak Loot2Antarmuka di Unity
IDamageableAntarmuka dan TryGetComponentGetComponentsRingkasan: Tombol InteractRingkasan: Terdekat dalam Jangkauan5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaSelamatkan AnginGelombang sebagai DataRekap: database ItemBeli dari Toko8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearestLatihan sendiri: Playground Unity