Menu
CoddyTech

נקו את הזירה

חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 55 מתוך 64.

אירוע שמסומן ב-static שייך למחלקה, ולא לאובייקט אחד. יש אירוע Enemy.Died אחד עבור כל אויב שיהיה אי פעם, כך שהמשריץ יכול להירשם אליו באמצעות Enemy.Died += OnEnemyDied; לפני שקיים אויב כלשהו, וכל אויב מפעיל אותו כשהוא עצמו משמש כארגומנט. אותו רעיון ב-C# רגיל:

public class Coin
{
    public static event Action<Coin> Picked;

    public void Pick()
    {
        Picked?.Invoke(this);
    }
}

public class Purse
{
    private int coins;

    public Purse()
    {
        Coin.Picked += OnPicked;   // עדיין אין צורך ב-Coin
    }

    void OnPicked(Coin coin)
    {
        coins++;
    }
}

ניגשים לאירוע של מופע דרך אובייקט, כמו hero.Died; לאירוע סטטי ניגשים דרך שם המחלקה, כמו Coin.Picked. אירוע סטטי ממשיך להתקיים גם לאחר שכל האובייקטים נעלמו, לכן צריך לבטל את ההרשמה אליו ב-OnDisable, אחרת משריץ שנהרס נשאר ברשימה שלו.

challenge icon

אתגר

בינוני

גרום לכל גל להמתין עד שהזירה תתרוקן.

  1. ב־Enemy, הוסף public static event Action<Enemy> Died; וקרא ל־Died?.Invoke(this); ממש לפני Destroy(gameObject);.
  2. ב־WaveSpawner, עקוב אחר alive: הוסף 1 בכל יצירה, והפחת 1 בשיטה ש־OnEnable מחבר ל־Enemy.Died ו־OnDisable מנתק.
  3. אחרי שגל נוצר, המתן כל עוד alive > 0.

לחץ על "שחק" והבס את גל 1: גל 2 יגיע כעבור 2 שניות. לאחר מכן לחץ על "בדיקה".

נסו בעצמכם

using System.Collections;
using UnityEngine;

public class WaveSpawner : MonoBehaviour
{
    [SerializeField] private WaveSet waveSet;
    [SerializeField] private Transform[] spawnPoints;

    public int Wave { get; private set; }

    void Start()
    {
        StartCoroutine(RunWaves());
    }

    IEnumerator RunWaves()
    {
        while (true)
        {
            foreach (Wave wave in waveSet.waves)
            {
                Wave++;
                Debug.Log("Wave " + Wave);
                for (int i = 0; i < wave.count; i++)
                {
                    Transform point = spawnPoints[i % spawnPoints.Length];
                    Instantiate(wave.enemy, point.position, Quaternion.identity);
                    yield return new WaitForSeconds(wave.spacing);
                }
                yield return new WaitForSeconds(waveSet.restBetweenWaves);
            }
        }
    }
}

כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity

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