מציאת מטרה
שיעור 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.
לחץ על שחק ובנה ליד המסלול: ה־Console יציג את שמו של כל מטרה חדשה. לאחר מכן לחץ על בדיקה.
נסו בעצמכם
using UnityEngine;
// בהמשך: מגדל מאתר אויב בטווח, פונה אליו ויורה.
public class Tower : MonoBehaviour
{
}
כל השיעורים ביחידה משחק Unity: הגנת מגדלים
תרגלו בעצמכם: Unity אונליין