Menu
CoddyTech

מציאת מטרה

שיעור 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.
challenge icon

אתגר

בינוני
  1. ב־Enemy, הוסף את public static readonly List<Enemy> All, רשימה חדשה. כל אויב מוסיף את עצמו ב־OnEnable ומסיר את עצמו ב־OnDisable.
  2. ב־Tower, הוסף float ציבורי בשם range (ה־prefab של ArrowTower מגדיר אותו ל־4.5) ו־Enemy פרטי בשם target.
  3. בכל פריים, הגדר את target לאויב מתוך Enemy.All הקרוב ביותר למגדל, כל עוד הוא בטווח range. אם אין אויב בטווח, target הוא null.

המגדל עדיין לא עושה דבר עם המטרה שלו: בשיעור הבא הוא ילמד לפנות אליה. לחץ על הפעל, בנה מגדל לצד השביל, ואז לחץ על בדיקה.

נסו בעצמכם

using UnityEngine;

public class Tower : MonoBehaviour
{
    public int cost = 50;
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה משחק Unity: הגנת מגדלים