Menu
CoddyTech

מציאת מטרה

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

אתגר

בינוני

כל מגדל בוחר את האויב הקרוב ביותר שנמצא בטווח.

  1. ב־Enemy, הוסף public static readonly List<Enemy> All = new List<Enemy>();; הוסף את this ב־OnEnable, והסר אותו ב־OnDisable.
  2. ב־Tower, הוסף public float range = 4f; ואת private Enemy target;.
  3. בכל פריים, מצא את האויב הקרוב ביותר מתוך Enemy.All שנמצא בתוך range (או null), הצג ביומן את "Target: " + found.name כשהוא חדש, ושמור אותו ב־target.

לחץ על שחק ובנה ליד המסלול: ה־Console יציג את שמו של כל מטרה חדשה. לאחר מכן לחץ על בדיקה.

נסו בעצמכם

using UnityEngine;

// בהמשך: מגדל מאתר אויב בטווח, פונה אליו ויורה.
public class Tower : MonoBehaviour
{
}

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

תרגלו בעצמכם: Unity אונליין