الأحداث تحرّك واجهة المستخدم
جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 15 من 64.
مع الأحداث، تتبع واجهة العرض داخل اللعبة اللعبة، بينما لا تعرف اللعبة شيئًا عن واجهة العرض. يتولى Health نقاط الصحة ويعلن عن أمرين: تغيّر الصحة، ووصولها إلى 0. لا يحتوي على حقل لشريط أو نص أو شاشة انتهاء اللعبة، لذا يعمل المكوّن نفسه على اللاعب، وعلى عدو ليس لديه واجهة عرض، وفي مشهد اختبار:
public class Health : MonoBehaviour
{
public int maxHp = 100;
public event Action<int, int> OnChanged;
public event Action OnDied;
public int Hp { get; private set; }
void Awake()
{
Hp = maxHp;
}
public void TakeDamage(int amount)
{
if (Hp == 0) return;
Hp = Mathf.Max(Hp - amount, 0);
OnChanged?.Invoke(Hp, maxHp);
if (Hp == 0) OnDied?.Invoke();
}
}// HealthBar.cs، على واجهة العرض HUD
public Health health;
public Image bar;
void OnEnable() { health.OnChanged += Show; }
void OnDisable() { health.OnChanged -= Show; }
void Start()
{
Show(health.Hp, health.maxHp);
}
void Show(int hp, int max)
{
bar.fillAmount = (float)hp / max;
}يستمع الشريط فقط عندما يكون نشطًا، باستخدام الزوج OnEnable وOnDisable. يمرر الحدث الرقمين، لذا لا تحتاج Show إلى أي شيء آخر من Health. يشترك GameOverScreen في OnDied لإظهار لوحته، ويشترك صوت الإصابة في OnChanged، كلٌّ في نص برمجي مستقل، ولا يتغير Health لأيٍّ منهما. تتيح Hp { get; private set; } لواجهة العرض قراءة الصحة دون تغييرها.
يُبلغ الحدث عن التغييرات، لذا لم يسمع الشريط شيئًا قبل الضربة الأولى. يعرض الصحة الحالية مرة واحدة في Start. وليس في OnEnable: تستدعي Unity الدالتين Awake ثم OnEnable لكل كائن على حدة، دون ترتيب محدد، لذا قد تُنفَّذ OnEnable الخاصة بالشريط قبل أن تضبط Awake الخاصة بـ Health قيمة Hp، وعندها سيعرض الشريط 0. وبحلول وقت تنفيذ أي دالة Start، تكون جميع دوال Awake قد نُفذت.
التحدي
سهلاجعل السلاح يعلن عن تغييراته واجعل HUD يستمع إليها.
- في
Gun.cs، أضفusing System;وpublic event Action<int, int> OnAmmoChangedوpublic event Action<bool> OnReloading؛ وارفع الأحداث في المواضع المشار إليها بالتعليقات. - في
AmmoHud.cs، اشترك فيOnEnableوألغِ الاشتراك فيOnDisable: يعرضammoTextالقيمةAmmo: 4/6، ولا يظهرreloadTextإلا أثناء إعادة التلقيم. - في
Start، اعرضgun.Ammoوgun.Reloadingمرة واحدة.
اضغط على «العب» وأفرغ مخزن السلاح مرتين. ثم اضغط على «تحقق».
جرّب بنفسك
using UnityEngine;
using TMPro;
public class AmmoHud : MonoBehaviour
{
public Gun gun;
public TMP_Text ammoText;
public GameObject reloadText;
}
جميع دروس هندسة الألعاب في Unity
1المكوّنات، لا التسلسلات الهرمية
مكوّنات صغيرةنص برمجي أساسي للعدومكوّنات مجرّدةالمكوّنات تعمل معًامراجعة: برج معياريمراجعة: مدفع مزدوج4البيانات المُسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائممراجعة: اختيار الغنائم عشوائيًا2الواجهات في Unity
IDamageableالواجهات وTryGetComponentGetComponentsمراجعة: مفتاح التفاعلمراجعة: أقرب عنصر ضمن النطاق3الأحداث
الأحداث في C# ضمن Unityالاشتراك في OnEnableحقول UnityEventالأحداث تحرّك واجهة المستخدممراجعة: نافذة الإنجاز المنبثقةمراجعة: مؤقّت النافذة المنبثقةتدرّب بنفسك: Playground لـ Unity