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.
Görev
KolayRobotun her parçası bir darbe tepkisi versin.
IHitReaction.csiçindepublic interface IHitReactionarayüzünüvoid React(int damage);ile tanımla.Flash,RecoilveSparkssı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.- Recoil,
0.5f * damagekadar geriye hareket eder; Sparks isedamagesayıda kıvılcım fırlatır. TakeDamageiçinde herGetComponentsInChildren<IHitReaction>()öğesindeReact(amount)çağrısı yap, ardındanReactions: 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
1Kalıtım Değil, Bileşenler
Küçük BileşenlerTemel Düşman Script'iSoyut BileşenlerBirlikte Çalışan BileşenlerTekrar: Modüler TaretTekrar: Çift Namlulu Top4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larTekrar: Ganimet TablosuTekrar: Ganimeti At2Unity'de Arayüzler
IDamageableArayüzler ve TryGetComponentGetComponentsÖzet: Etkileşim TuşuÖzet: Erişim Mesafesindeki En Yakın5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriOrtak AyarlarRüzgârı KaydetVeri Olarak DalgalarTekrar: Eşya VeritabanıTekrar: Dükkândan Satın Al8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearestKendi başına pratik yap: Unity playground