العثور على هدف
الدرس 8 من 25 في دورة لعبة Unity: الدفاع عن الأبراج على Coddy.
يطلق البرج النار على أقرب عدو إليه، ما دام ذلك العدو ضمن range البرج. لاختيار الهدف، يحتاج البرج إلى معرفة كل عدو على اللوحة. يبحث FindObjectsByType<Enemy> في المشهد بأكمله في كل إطار ولكل برج، لذا تحتفظ الأعداء بدلًا من ذلك بقائمة خاصة بها: قائمة ثابتة في الصنف Enemy، ينضم إليها كل عدو في OnEnable ويغادرها في OnDisable. تستدعي Unity الدالة OnDisable على الكائن الذي يجري تدميره، لذا يغادر العدو الميت القائمة أيضًا. ويمكن للمقتنيات في اللعبة أن تفعل الشيء نفسه:
public class Pickup : MonoBehaviour
{
public static readonly List<Pickup> All = new List<Pickup>();
void OnEnable()
{
All.Add(this);
}
void OnDisable()
{
All.Remove(this);
}
}العثور على الأقرب يتم عبر حلقة تتذكر أفضل خيار حتى الآن. يبدأ مغناطيس يسحب أقرب مقتنى ضمن pullRange من دون مقتنى، ويجعل المدى هو أفضل مسافة، لذا لا يمكن لمقتنى أبعد أن يفوز:
Pickup best = null;
float bestDistance = pullRange;
foreach (Pickup pickup in Pickup.All)
{
// هل هو أقرب من أفضل خيار حتى الآن؟ احتفظ به وبالمسافة إليه
}Vector3.Distance(a, b) تعطي المسافة بين نقطتين. عندما لا يكون أي شيء ضمن المدى، لا تحتفظ الحلقة بأي شيء، وتكون الإجابة null.التحدي
متوسطيختار كل برج أقرب عدو ضمن النطاق.
- في
Enemy، أضفpublic static readonly List<Enemy> All = new List<Enemy>();؛ وأضفthisفيOnEnable، وأزِله فيOnDisable. - في
Tower، أضفpublic float range = 4f;وprivate Enemy target;. - في كل إطار، ابحث عن أقرب عدو ضمن
Enemy.Allوفي حدودrange(أو أعد null)، وسجّل"Target: " + found.nameعندما يكون هدفًا جديدًا، واحتفظ به فيtarget.
اضغط «العب» وابنِ قرب المسار: تعرض وحدة التحكم اسم كل هدف جديد. ثم اضغط «تحقق».
جرّب بنفسك
using UnityEngine;
// لاحقًا: يجد البرج عدوًا ضمن نطاقه، ويستدير نحوه ويطلق النار.
public class Tower : MonoBehaviour
{
}
جميع دروس لعبة Unity: الدفاع عن الأبراج
تدرّب بنفسك: Playground لـ Unity