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

المكافآت

الدرس 10 من 18 في دورة لعبة 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، أعلِن عن حدث عام وثابت Killed (Action<Enemy>). أطلقه مع العدو عندما تجعل TakeDamage صحته 0 أو أقل، مباشرةً قبل تدميره.
  2. تُحتسب عملية القتل مرة واحدة: عندما يُستدعى TakeDamage لعدو صحته بالفعل 0 أو أقل، فلا يفعل شيئًا.
  3. في GameManager، أضف public void Earn(int amount)، التي تضيف إلى المال وتعرضه. اشترك في Enemy.Killed بجوار ReachedBase، وأضف مكافأة العدو المقتول reward إلى المال.

اضغط على Play وشاهد المال يزداد بينما تعمل الأبراج، ثم اضغط على Check.

جرّب بنفسك

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: الدفاع عن الأبراج