Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Eğ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 IHitReaction arayü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 TakeDamage metodunda, hp azaldıktan sonra Robot ve alt nesnelerindeki her IHitReaction üzerinde React(amount) çağır. Bunları tek bir GetComponentsInChildren çağrısıyla bul ve kaç tanesinin tepki verdiğini Reactions: 3 olarak 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();
    }
}
quiz iconKendini test et

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