Menu
CoddyTech

הגיעו לבסיס

שיעור 3 מתוך 18 בקורס משחק Unity: הגנת מגדלים של Coddy.

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

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

public class Coin : MonoBehaviour
{
    public static event Action<Coin> Collected;
    public int value = 1;

    void OnTriggerEnter(Collider other)
    {
        Collected?.Invoke(this);
        Destroy(gameObject);
    }
}
// ScoreBoard.cs
void OnEnable()
{
    Coin.Collected += AddCoin;
}

void OnDisable()
{
    Coin.Collected -= AddCoin;
}

void AddCoin(Coin coin)
{
    score += coin.value;
}

אירוע סטטי נשאר קיים כל עוד המשחק פועל, ולכן ל־-= יש חשיבות גדולה מתמיד: עדיין היו קוראים ל־ScoreBoard שהושמד ולא בוטל ממנו הרישום, והקוד שלו היה נכשל כשהיה מנסה לגשת לטקסט שהושמד. OnEnable ו־OnDisable באים בזוגות, ולכן לכל += יש -= תואם.

challenge icon

אתגר

קל

לבסיס יש נקודות חיים, ואויב שמגיע אליו חייב לגרוע מהן.

  1. ב־EnemyData, הוסף int ציבורי בשם damage: מספר נקודות החיים שסוג האויב הזה מוריד מהבסיס.
  2. ב־Enemy, הכרז על אירוע סטטי ציבורי בשם ReachedBase שמעביר את האויב (Action<Enemy>). כשהאויב מגיע לנקודת הציון האחרונה, הפעל את האירוע והעבר לו את האויב עצמו, והשמד את האויב במקום לעצור שם.
  3. ב־GameManager, הוסף int מסודר בשם startLives (20) ו־int פרטי בשם lives שמתחיל בערך הזה. הירשם ל־Enemy.ReachedBase ב־OnEnable והסר את ההרשמה ב־OnDisable. כל אויב שמצליח לעבור מוריד מנקודות החיים את ערך ה־damage של הנכס שלו.
  4. הצג את נקודות החיים ב־TMP_Text מסודר בשם livesText, בתור Lives: 20, בתחילת המשחק ואחרי כל שינוי.

לאובייקט Game יש את GameManager, בחלון Inspector מקשרים את LivesText, ושני הנכסים מורידים נקודת חיים אחת. לחץ על Play, המתן עד ששני האויבים יגיעו לבסיס, ואז לחץ על Check.

נסו בעצמכם

using UnityEngine;

public class Enemy : MonoBehaviour
{
    public EnemyData data;
    public Transform[] waypoints;

    private int next = 1;
    private int health;

    void Awake()
    {
        health = data.maxHealth;
    }

    void Update()
    {
        if (next >= waypoints.Length)
        {
            return;
        }

        Vector3 target = waypoints[next].position;
        transform.position = Vector3.MoveTowards(transform.position, target, data.speed * Time.deltaTime);
        if (transform.position == target)
        {
            next++;
        }
    }
}
quiz iconבחנו את עצמכם

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

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