נקו את הזירה
חלק מהיחידה ארכיטקטורת משחקים ב-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, אחרת משריץ שנהרס נשאר ברשימה שלו.
אתגר
בינוניגרום לכל גל להמתין עד שהזירה תתרוקן.
- ב־
Enemy, הוסףpublic static event Action<Enemy> Died;וקרא ל־Died?.Invoke(this);ממש לפניDestroy(gameObject);. - ב־
WaveSpawner, עקוב אחרalive: הוסף 1 בכל יצירה, והפחת 1 בשיטה ש־OnEnableמחבר ל־Enemy.Diedו־OnDisableמנתק. - אחרי שגל נוצר, המתן כל עוד
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
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיסי לאויברכיבים מופשטיםרכיבים שפועלים יחדחזרה: צריח מודולריחזרה: תותח כפול4נתונים שעברו סריאליזציה
מחלקות שניתנות לסריאליזציהרשימות ב־Inspectorטיפוסי Enum ב־Inspectorחזרה: טבלת שללהגרלת השלל10פרויקט: שורדים בזירה
הגיבורסוגי אויבים2ממשקים ב-Unity
IDamageableממשקים ו-TryGetComponentGetComponentsסיכום: מקש אינטראקציהסיכום: הקרוב ביותר בטווחתרגלו בעצמכם: Unity אונליין