מציאת מטרה
שיעור 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, הוסף float ציבורי בשםrange(ה־prefab של ArrowTower מגדיר אותו ל־4.5) ו־Enemy פרטי בשםtarget. - בכל פריים, הגדר את
targetלאויב מתוךEnemy.Allהקרוב ביותר למגדל, כל עוד הוא בטווחrange. אם אין אויב בטווח,targetהוא null.
המגדל עדיין לא עושה דבר עם המטרה שלו: בשיעור הבא הוא ילמד לפנות אליה. לחץ על הפעל, בנה מגדל לצד השביל, ואז לחץ על בדיקה.
נסו בעצמכם
using UnityEngine;
public class Tower : MonoBehaviour
{
public int cost = 50;
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.