اعثر على هدف
الدرس 7 من 18 في دورة لعبة 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، وهي قائمة جديدة. يضيف كل عدو نفسه فيOnEnableويزيل نفسه فيOnDisable. - في
Tower، أضفrangeمن النوع float وعلنيًا (يضبطه prefab المسمى ArrowTower على 4.5) وtargetمن النوع Enemy وخاصًا. - في كل إطار، اجعل
targetيشير إلى أقرب عدو إلى البرج ضمنEnemy.All، ما دام داخلrange. إذا لم يكن هناك عدو ضمن النطاق، تكون قيمةtargetهي null.
لا يفعل البرج شيئًا بهدفه بعد: سيجعله الدرس التالي يواجهه. اضغط Play، وابنِ برجًا بجانب المسار، ثم اضغط Check.
جرّب بنفسك
using UnityEngine;
public class Tower : MonoBehaviour
{
public int cost = 50;
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.