Menu
CoddyTech

المكافآت

الدرس 13 من 25 في دورة لعبة Unity: الدفاع عن الأبراج على Coddy.

كل عدو تُسقطه برجٌ يكافئك بـ reward. يبلّغ Enemy عن القتل بالطريقة نفسها التي يبلّغ بها عن الوصول إلى القاعدة، باستخدام حدث ثابت، Killed، ويستمع GameManager إلى الحدث ويضيف المال.

يجب أن يُكافأ القتل مرة واحدة. لا يزيل Destroy الكائن فورًا؛ بل يُزال في نهاية الإطار، وحتى ذلك الحين يظل داخل اللعبة. قد تصيب طلقتان في الإطار نفسه، فتجد الطلقة الثانية عدوًا صحته 0 وما زال موجودًا. إذا أبلغ TakeDamage عن قتل في كل مرة تكون فيها الصحة 0 أو أقل، فستكافئ الطلقة الثانية القتل مرة أخرى. تنطوي لعبة بالونات تستخدم السهام على الفخ نفسه، ويمنعه متغير bool:

public void Pop()
{
    if (popped)
    {
        return;
    }

    popped = true;
    Popped?.Invoke(this);
    Destroy(gameObject);
}

لا يحتاج العدو إلى متغير bool إضافي، لأن صحته تحدد بالفعل ما إذا كان ميتًا: إذا وجد TakeDamage أن الصحة 0 أو أقل، فلن يكون هناك شيء آخر ليفعله.

challenge icon

التحدي

متوسط

تمنح كل عملية قتل مكافأة العدو.

  1. في Enemy، أضف public static event Action<Enemy> Killed; وأطلق الحدث في TakeDamage مباشرةً قبل تدمير العدو.
  2. ابدأ TakeDamage بـ if (health <= 0) return;، لكي تُمنح المكافأة مرة واحدة عند القتل.
  3. في GameManager، أضف public void Earn(int amount) (أضِفه واعرضه)، واشترك في Enemy.Killed لكسب enemy.data.reward.

اضغط «العب»: يزداد المال بينما تعمل الأبراج. ثم اضغط «تحقق».

جرّب بنفسك

using System;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour, IDamageable
{
    public static readonly List<Enemy> All = new List<Enemy>();
    public static event Action<Enemy> ReachedBase;

    public EnemyData data;
    public Transform[] waypoints;

    private int next = 1;
    private int health;

    void Awake()
    {
        health = data.maxHealth;
    }

    void OnEnable()
    {
        All.Add(this);
    }

    void OnDisable()
    {
        All.Remove(this);
    }

    void Update()
    {
        Vector3 target = waypoints[next].position;
        transform.position = Vector3.MoveTowards(transform.position, target, data.speed * Time.deltaTime);
        if (transform.position == target)
        {
            next++;
            if (next == waypoints.Length)
            {
                ReachedBase?.Invoke(this);
                Destroy(gameObject);
            }
        }
    }

    public void TakeDamage(int amount)
    {
        health -= amount;
        if (health <= 0)
        {
            Destroy(gameObject);
        }
    }
}
quiz iconاختبر نفسك

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

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

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