Menu
CoddyTech

GetComponents

Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 9 / 64.

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 onun 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 SetPower metodunda ışığını açar, bir Vantilatör dönmeye başlar, bir Konveyör hareket etmeye başlar. Bir nesnede hem Lamba hem de Vantilatör bulunan 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'nin altına eklenen ve IPowered arayüzünü uygulayan bir Siren, bir sonraki Switch çağrısıyla açılır.

GetComponentsInChildren, çağrıyı yaptığınız nesnenin kendisini de içerir ve true değerini iletmediğiniz sürece etkin olmayan alt öğeleri atlar: GetComponentsInChildren<IPowered>(true). GetComponents yalnızca tek nesneye bakar; bu da aynı kapıda yan yana duran ışık ve zil gibi parçalar için uygundur.

challenge icon

Görev

Kolay

Robotun her parçası bir darbe tepkisi versin.

  1. IHitReaction.cs içinde public interface IHitReaction arayüzünü void React(int damage); ile tanımla.
  2. Flash, Recoil ve Sparks sınıflarının bu arayüzü uygulamasını sağla: her yöntemin adını public void React(int damage) olarak değiştir.
  3. Recoil, 0.5f * damage kadar geriye hareket eder; Sparks ise damage sayıda kıvılcım fırlatır.
  4. TakeDamage içinde her GetComponentsInChildren<IHitReaction>() öğesinde React(amount) çağrısı yap, ardından Reactions: 3 (öğe sayısı) değerini günlüğe yaz.

“Oyna” düğmesine bas, Space tuşuna bas, ardından tıkla. Sonra “Kontrol et” düğmesine bas.

Kendin dene

using UnityEngine;

public class Health : MonoBehaviour
{
    public int hp = 10;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        GetComponentInChildren<Flash>().Show();
    }
}

Unity'de Oyun Mimarisi bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground