GetComponents
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 8 / 50.
GetComponent<T>() ilk eşleşmeyi döndürür. GetComponents<T>() nesnedeki tüm eşleşmeleri bir dizi olarak döndürür; GetComponentsInChildren<T>() ise nesnedeki ve altındaki her şeyde bulunan tüm eşleşmeleri döndürür. T olarak bir arayüz kullanıldığında, tek bir çağrı sınıfı ne olursa olsun bir şey yapabilen her parçayı toplar. Burada bir fabrikanın makineleri Factory nesnesinin alt öğeleridir ve güçle çalışan her parça IPowered arayüzünü uygular:
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");
}
}Bir Lamba kendi Light bileşenini açar, bir Fan dönmeye başlar, bir Konveyör hareket etmeye başlar; her biri bunu kendi SetPower metodunda yapar. Aynı nesnede bir Lamba ve bir Fan bulunan bir makine iki kez sayılır; çünkü her bileşen ayrı bir eşleşmedir. Generator bunların adını hiçbir zaman belirtmez; bu nedenle daha sonra Factory altına eklenen ve IPowered arayüzünü uygulayan bir Siren, sonraki Switch çağrısında açılır.
GetComponentsInChildren, üzerinde çağrıldığı nesneyi de içerir ve true iletmediğin sürece etkin olmayan alt öğeleri atlar: GetComponentsInChildren<IPowered>(true). GetComponents yalnızca tek nesneye bakar; bu da aynı kapıdaki ışık ve zil gibi yan yana duran parçalar için uygundur.
Görev
KolayEğitim robotu aldığı her darbeyi göstermeli. Robot üzerindeki Health.cs, hp değerini sayar ve üç parça tepki verebilir: Head üzerindeki Flash onu kırmızıya çevirir, Robot üzerindeki Recoil onu geriye sarsar ve Antenna üzerindeki Sparks kıvılcımlar saçar. Space tuşuna basmak robota 1, tıklamak ise 2 hasar verir (Trainer.cs hazır). Şu anda Health yalnızca kafaya haber veriyor.
- IHitReaction.cs dosyasında, bir metodu olan
IHitReactionarayüzünü tanımla:void React(int damage). - Flash, Recoil ve Sparks sınıflarına bu arayüzü uygulat: her birinin metodu
React(int damage)olsun. Flash, daha önce yaptığı şeyi yapsın. Recoil, her hasar puanı başına robotu 0.5 birim geriye (+z) sarsın ve Sparks, her hasar puanı başına bir kıvılcım salsın. - Health'in
TakeDamagemetodunda, hp azaldıktan sonra Robot ve alt nesnelerindeki her IHitReaction üzerindeReact(amount)çağır. Bunları tek bir GetComponentsInChildren çağrısıyla bul ve kaç tanesinin tepki verdiğiniReactions: 3olarak günlüğe yaz.
Play'e bas, robota Space tuşuyla ve tıklayarak vur, ardından Check'e bas.
Kendin dene
using UnityEngine;
public class Health : MonoBehaviour
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
GetComponentInChildren<Flash>().Show();
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Unity'de Oyun Mimarisi bölümündeki tüm dersler
1Hiyerarşiler Değil, Bileşenler
Küçük BileşenlerTemel Bir Düşman BetiğiSoyut BileşenlerBirlikte Çalışan BileşenlerÖzet: Modüler Taret4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larÖzet: Ganimet Tablosu7Durum Makineleri
Sınıflar Olarak DurumlarBir Durum MakinesiGeçişlerDüşmanların Yapay ZekâsıTekrar: Kapı Durumları10Proje: Arena Hayatta Kalma
KahramanDüşman Türleri5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriPaylaşılan AyarlarVeri Olarak DalgalarTekrar: Eşya Veritabanı8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearest