Menu
CoddyTech

GetComponents

جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 9 من 64.

تعيد GetComponent<T>() أول تطابق. وتعيد GetComponents<T>() كل تطابق على الكائن في صورة مصفوفة، بينما تعيد GetComponentsInChildren<T>() كل تطابق على الكائن وفي كل ما يقع تحته. عند استخدام واجهة بوصفها T، يجمع استدعاء واحد كل جزء قادر على أداء مهمة، أيًّا كانت فئته. هنا، تكون آلات المصنع أبناءً للكائن Factory، وكل جزء يعمل بالطاقة يطبّق 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 حالة Light، ويبدأ Fan بالدوران، ويبدأ Conveyor بالحركة، وكلٌّ منها يفعل ذلك في SetPower الخاص به. تُحتسب الآلة التي تضم Lamp وFan على كائن واحد مرتين، لأن كل مكوّن يُعدّ تطابقًا مستقلًا. لا يذكر Generator أسماءها مطلقًا، لذا فإن Siren التي تطبّق IPowered، إذا أُضيفت تحت Factory لاحقًا، ستُشغَّل عند استدعاء Switch التالي.

يشمل GetComponentsInChildren الكائن الذي تستدعيه عليه، ويتجاوز أبناءه غير النشطين ما لم تمرّر true: GetComponentsInChildren<IPowered>(true). أما GetComponents فيفحص الكائن الواحد فقط، وهذا يناسب الأجزاء المتجاورة، مثل مصباح وجرس على الباب نفسه.

challenge icon

التحدي

سهل

اجعل كل جزء من الروبوت يُظهر تعرّضه لضربة.

  1. في IHitReaction.cs، عرّف public interface IHitReaction مع void React(int damage);.
  2. اجعل Flash وRecoil وSparks تنفّذ هذه الواجهة: أعد تسمية كل دالة إلى public void React(int damage).
  3. تحرّك Recoil إلى الخلف بمقدار 0.5f * damage؛ وتقذف Sparks عددًا من الشرارات يساوي damage.
  4. في TakeDamage، استدعِ React(amount) على كل عنصر من GetComponentsInChildren<IHitReaction>()، ثم سجّل Reactions: 3 (عددها).

اضغط «العب»، ثم اضغط على Space، ثم انقر. بعد ذلك اضغط «تحقق».

جرّب بنفسك

using UnityEngine;

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

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

جميع دروس هندسة الألعاب في Unity

تدرّب بنفسك: Playground لـ Unity