Menu
CoddyTech

حقول UnityEvent

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

إنّ «عند النقر» للزر هو حقل UnityEvent، ويمكن أن تحتوي نصوصك البرمجية الخاصة على حقل مثله أيضًا. يظهر حقل UnityEvent عام في نافذة Inspector على هيئة القائمة نفسها، وتطلقه النصوص البرمجية باستخدام Invoke() من دون معرفة ما تم ربطه به. يعمل هذا العدّ التنازلي مرة كل ثانية:

using UnityEngine;
using UnityEngine.Events;

public class Countdown : MonoBehaviour
{
    public int seconds = 3;
    public UnityEvent<int> onTick;
    public UnityEvent onFinished;

    void Start()
    {
        InvokeRepeating("Tick", 1f, 1f);
    }

    void Tick()
    {
        seconds--;
        onTick.Invoke(seconds);
        if (seconds == 0)
        {
            CancelInvoke("Tick");
            onFinished.Invoke();
        }
    }
}

في نافذة Inspector، يقبل «عند الانتهاء» صفوفًا مثل تلك الموجودة في الزر: يشغّل صفٌّ الصاروخ، ويفتح صفٌّ آخر البوابة. ويعيد مستوى آخر استخدام Countdown نفسه مع صفوف أخرى، من دون أن يكتب أحد نصًا برمجيًا جديدًا. يمرّر UnityEvent<int> قيمة. في قائمته المنسدلة، تُدرج الطريقة التي تقبل عددًا صحيحًا تحت «عدد صحيح ديناميكي»، ويحصل ذلك الصف على القيمة المُمرّرة إلى Invoke، وهي هنا عدد الثواني المتبقية. أما الطريقة نفسها ضمن «المعلمات الثابتة»، فتحصل بدلًا من ذلك على عدد يُكتب في الصف، ويمكن أيضًا ربط الطرق التي لا تقبل أي معلمة.

تنشئ Unity حقل UnityEvent عند تحميل النص البرمجي، لذا لا تكون onTick أبدًا null ولا تحتاج إلى ?.، ويمكن للنص البرمجي إضافة مستمعين باستخدام onTick.AddListener(ShowSeconds). اختر UnityEvent عندما يختلف التفاعل من كائن إلى آخر ويُضبط في نافذة Inspector، سواء أعددته أنت أم مصمم لا يفتح النص البرمجي مطلقًا. اختر حدث C# عندما يستمع إليه الكود: إذ يتحقق المترجم من أسماء الطرق، لذا يؤدي تغيير الاسم إلى فشل عملية البناء بدلًا من ترك صف <Missing> من دون تنبيه، كما أن حدث C# لا يظهر أبدًا في نافذة Inspector.

challenge icon

التحدي

سهل

أضف إلى FinishLine الأحداث التي ترتبط بها صفوف المشهد.

  1. أضف using UnityEngine.Events; وpublic UnityEvent<int> onLap; وpublic UnityEvent onRaceOver; ومتغيرًا خاصًا من النوع int لعدد اللفات المنجزة.
  2. في OnTriggerEnter، عندما تكون other موسومة بـ Player، احتسب اللفة واستدعِ onLap.Invoke مع عدد اللفات المنجزة.
  3. عندما يصل العدد إلى laps، استدعِ onRaceOver.Invoke()؛ بعد ذلك، لن يؤدي عبور خط النهاية إلى أي شيء.

اضغط على «العب» وقُد السيارة ثلاث لفات. ثم اضغط على «تحقق».

جرّب بنفسك

using UnityEngine;

public class FinishLine : MonoBehaviour
{
    public int laps = 3;

    void OnTriggerEnter(Collider other)
    {
        // عبرت السيارة خط النهاية: اكتملت دورة إضافية
    }
}

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

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