حقول 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.
التحدي
سهلأضف إلى FinishLine الأحداث التي ترتبط بها صفوف المشهد.
- أضف
using UnityEngine.Events;وpublic UnityEvent<int> onLap;وpublic UnityEvent onRaceOver;ومتغيرًا خاصًا من النوعintلعدد اللفات المنجزة. - في
OnTriggerEnter، عندما تكونotherموسومة بـPlayer، احتسب اللفة واستدعِonLap.Invokeمع عدد اللفات المنجزة. - عندما يصل العدد إلى
laps، استدعِonRaceOver.Invoke()؛ بعد ذلك، لن يؤدي عبور خط النهاية إلى أي شيء.
اضغط على «العب» وقُد السيارة ثلاث لفات. ثم اضغط على «تحقق».
جرّب بنفسك
using UnityEngine;
public class FinishLine : MonoBehaviour
{
public int laps = 3;
void OnTriggerEnter(Collider other)
{
// عبرت السيارة خط النهاية: اكتملت دورة إضافية
}
}
جميع دروس هندسة الألعاب في Unity
1المكوّنات، لا التسلسلات الهرمية
مكوّنات صغيرةنص برمجي أساسي للعدومكوّنات مجرّدةالمكوّنات تعمل معًامراجعة: برج معياريمراجعة: مدفع مزدوج4البيانات المُسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائممراجعة: اختيار الغنائم عشوائيًا2الواجهات في Unity
IDamageableالواجهات وTryGetComponentGetComponentsمراجعة: مفتاح التفاعلمراجعة: أقرب عنصر ضمن النطاقتدرّب بنفسك: Playground لـ Unity