Menu
CoddyTech

الأحداث تحرّك واجهة المستخدم

جزء من قسم هندسة الألعاب في 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 قد نُفذت.

challenge icon

التحدي

سهل

اجعل السلاح يعلن عن تغييراته واجعل HUD يستمع إليها.

  1. في Gun.cs، أضف using System; وpublic event Action<int, int> OnAmmoChanged وpublic event Action<bool> OnReloading؛ وارفع الأحداث في المواضع المشار إليها بالتعليقات.
  2. في AmmoHud.cs، اشترك في OnEnable وألغِ الاشتراك في OnDisable: يعرض ammoText القيمة Ammo: 4/6، ولا يظهر reloadText إلا أثناء إعادة التلقيم.
  3. في Start، اعرض gun.Ammo وgun.Reloading مرة واحدة.

اضغط على «العب» وأفرغ مخزن السلاح مرتين. ثم اضغط على «تحقق».

جرّب بنفسك

using UnityEngine;
using TMPro;

public class AmmoHud : MonoBehaviour
{
    public Gun gun;
    public TMP_Text ammoText;
    public GameObject reloadText;
}

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

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