Menu
CoddyTech
flag Ar iconالعربيةdown icon

GetComponents

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

تعيد 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

التحدي

سهل

يجب أن يُظهر روبوت التدريب كل ضربة. يحصي Health.cs على Robot قيمة hp، ويمكن لثلاثة أجزاء أن تتفاعل: يحوّل Flash على Head لونه إلى الأحمر، ويجعل Recoil على Robot يرتد إلى الخلف، وتُطلق Sparks على Antenna شرارات. تُلحق Space بالروبوت ضررًا بمقدار 1، وتُحدث النقرة ضررًا بمقدار 2 (Trainer.cs جاهز). حاليًا، لا يُبلغ Health سوى الرأس.

  • في IHitReaction.cs، صرّح عن واجهة IHitReaction تتضمن طريقة واحدة، وهي void React(int damage).
  • اجعل Flash وRecoil وSparks تنفّذ هذه الواجهة: تصبح طريقة كل منها React(int damage). أبقِ Flash على سلوكه الحالي. اجعل Recoil يُرجع الروبوت إلى الخلف بمقدار 0.5 وحدة (+z) لكل نقطة ضرر، واجعل Sparks تُطلق شرارة واحدة لكل نقطة ضرر.
  • في TakeDamage الخاصة بـ Health، بعد إنقاص hp، استدعِ React(amount) على كل IHitReaction في Robot وأجزائه الفرعية، واعثر عليها باستدعاء واحد لـ GetComponentsInChildren، ثم سجّل عدد الأجزاء التي تفاعلت، بالشكل Reactions: 3.

اضغط Play، واضرب الروبوت باستخدام Space وبنقرة، ثم اضغط Check.

جرّب بنفسك

using UnityEngine;

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

    public void TakeDamage(int amount)
    {
        hp -= amount;
        GetComponentInChildren<Flash>().Show();
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

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