Menu
CoddyTech
flag Ar iconالعربيةdown icon

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

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

مع الأحداث، تتبع واجهة العرض العلوية (HUD) اللعبة، بينما لا تعرف اللعبة شيئًا عن واجهة العرض العلوية. يتولى 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

التحدي

سهل

ميدان رماية. يطلق مفتاح المسافة النار من المسدس (Gun.cs)، الذي يحتوي على maxAmmo (6) طلقات، ويؤدي إطلاق الطلقة الأخيرة إلى بدء إعادة تعبئة تستغرق reloadTime (1.5) ثانية، ثم تعيد ملء المخزن. لا تعرض واجهة HUD أيًا من هذه المعلومات حتى الآن. اجعل المسدس يعلن عن تغييراته واجعل واجهة HUD تستمع إليها؛ ولا تضف إلى المسدس حقلًا لواجهة HUD.

  • في Gun.cs، أضف حدثين عامّين: OnAmmoChanged، الذي يمرر عدد الطلقات وmaxAmmo (عددين صحيحين)، وOnReloading، الذي يمرر قيمة منطقية: true عند بدء إعادة التعبئة، وfalse عند انتهائها. أطلق الحدثين في المواضع المشار إليها بالتعليقات.
  • في AmmoHud.cs (على واجهة HUD)، استمع إلى الحدثين ما دامت واجهة HUD نشطة. يعرض ammoText عدد الطلقات بهذا الشكل: Ammo: 4/6، ولا يظهر reloadText (الكائن الذي يحتوي على النص Reloading...) إلا أثناء إعادة التعبئة.
  • يجب أن تعرض واجهة HUD القيم الصحيحة منذ البداية، قبل إطلاق الطلقة الأولى: Ammo: 6/6، ومن دون نص إعادة التعبئة. تعرض الخاصيتان Ammo وReloading في المسدس القيم الحالية.
  • إذا دُمّرت واجهة HUD، يواصل المسدس إطلاق النار دون أخطاء.

اضغط على تشغيل، وأفرغ مخزن المسدس مرتين، ثم اضغط على تحقّق.

جرّب بنفسك

using UnityEngine;
using TMPro;

public class AmmoHud : MonoBehaviour
{
    public Gun gun;
    public TMP_Text ammoText;
    public GameObject reloadText;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

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