حقول UnityEvent
جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 12 من 50.
حقل On Click () في الزر هو 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، يتضمن On Finished () صفوفًا مثل تلك الموجودة في الزر: يشغّل صف واحد الصاروخ، ويفتح صف آخر البوابة. يعيد مستوى آخر استخدام Countdown نفسه مع صفوف أخرى، ولا يحتاج أحد إلى كتابة نص برمجي جديد. يمرر UnityEvent<int> قيمة. في قائمته المنسدلة، تظهر الطريقة التي تأخذ int ضمن Dynamic int، ويحصل هذا الصف على القيمة المعطاة إلى Invoke، وهي هنا الثواني المتبقية. أما الطريقة نفسها ضمن Static Parameters فتحصل بدلًا من ذلك على رقم تكتبه في الصف، ويمكن أيضًا توصيل طرق بلا معاملات.
ينشئ Unity حقل UnityEvent عند تحميل النص البرمجي، لذا لا تكون قيمة onTick أبدًا null ولا تحتاج إلى ?.، ويمكن للشفرة إضافة مستمعين باستخدام onTick.AddListener(ShowSeconds). اختر UnityEvent عندما يختلف رد الفعل من كائن إلى آخر ويُضبط في Inspector، بواسطتك أو بواسطة مصمم لا يفتح النص البرمجي أبدًا. اختر حدث C# عندما تستمع الشفرة: يتحقق المترجم من أسماء الطرق، لذا يؤدي تغيير الاسم إلى فشل البناء بدلًا من ترك صف <Missing> صامت، ولا يظهر حدث C# أبدًا في Inspector.
التحدي
سهلسباق من ثلاث لفات حول الجزيرة. تتحكم الأسهم بالسيارة (Car.cs)، وقد أُعدّ المشهد بالطريقة التي يُعدّه بها المصمم في Inspector: تستدعي قائمة On Lap (Int32) في FinishLine الدالة LapBoard.ShowLaps (Dynamic int) على LapText والدالة Crowd.Cheer على Crowd، وتستدعي قائمة On Race Over () الدالتين LapBoard.ShowFinished وCar.Stop. هذه السكربتات جاهزة، لكن لا شيء يمكن إرفاقه بالصفوف إلى أن يحتوي FinishLine على الأحداث.
اكتب FinishLine.cs:
- حقلا UnityEvent:
onLap، الذي يمرر قيمة int، وonRaceOver، الذي لا يمرر أي شيء. - في كل مرة تدخل فيها السيارة (ذات الوسم
Player) خط النهاية، تُحتسب لفة: استدعِonLapمع عدد اللفات المكتملة (1، ثم 2، ثم 3). لا يُحتسب أي شيء آخر يعبر الخط. - عندما يصل عدد اللفات المكتملة إلى
laps(3)، استدعِonRaceOver. بعد ذلك، لن يؤدي عبور الخط إلى أي شيء.
اضغط Play، وقُد السيارة ثلاث لفات حول الجزيرة، ثم اضغط Check.
جرّب بنفسك
using UnityEngine;
public class FinishLine : MonoBehaviour
{
public int laps = 3;
void OnTriggerEnter(Collider other)
{
// عبرت السيارة خط النهاية: اكتملت لفة أخرى
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس هندسة الألعاب في Unity
1المكوّنات لا التسلسلات الهرمية
مكوّنات صغيرةسكربت أساسي للعدومكوّنات مجرّدةتعمل المكوّنات معًامراجعة: برج دفاعي معياري4البيانات المتسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائم10مشروع: الناجي في الساحة
البطلأنواع الأعداء