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 إلى الكائن الواحد فقط، وهذا يناسب الأجزاء المتجاورة، مثل ضوء وجرس على باب واحد.
التحدي
سهليجب أن يُظهر روبوت التدريب كل ضربة. يحصي 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();
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس هندسة الألعاب في Unity
1المكوّنات لا التسلسلات الهرمية
مكوّنات صغيرةسكربت أساسي للعدومكوّنات مجرّدةتعمل المكوّنات معًامراجعة: برج دفاعي معياري4البيانات المتسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائم10مشروع: الناجي في الساحة
البطلأنواع الأعداء