المكافآت
الدرس 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 أو أقل، فلن يكون هناك شيء آخر ليفعله.
التحدي
متوسطتمنح كل عملية قتل مكافأة العدو.
- في
Enemy، أضفpublic static event Action<Enemy> Killed;وأطلق الحدث فيTakeDamageمباشرةً قبل تدمير العدو. - ابدأ
TakeDamageبـif (health <= 0) return;، لكي تُمنح المكافأة مرة واحدة عند القتل. - في
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);
}
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس لعبة Unity: الدفاع عن الأبراج
تدرّب بنفسك: Playground لـ Unity