התאימו אותו אישית
שיעור 25 מתוך 25 בקורס משחק Unity: הגנת מגדלים של Coddy.
למשחק דרוש סיום. מפסידים בו כשהחיים מגיעים ל־0, ומנצחים בו לאחר שכל הגלים נשלחו ולא נותרו אויבים. המשגר ממתין עד שהלוח ריק באמצעות WaitUntil, שבודקת למבדה פעם בכל פריים, ואז מפעיל אירוע:
yield return new WaitUntil(() => switchesOn == switches.Length);כל אחד מהסיומים מציג את EndPanel ועוצר את המשחק באמצעות Time.timeScale = 0. טנק שסופג נזק של 2 כשנותרה לו נקודת חיים אחת עלול לדלג מעל בדיקה של 0 בדיוק, ולכן Mathf.Max משאירה את מספר החיים על 0 או יותר. Time.timeScale שומרת על הערך שלה גם לאחר טעינת סצנה, ולכן „שחק שוב” מאפס אותה תחילה ל־1.
עכשיו הפכו את המשחק לשלכם. כאן הערכים של startMoney (150), startLives (20) ו־timeBetweenWaves (8) נקבעים בקוד, כי ה־Inspector של השחקן הזה הוא לקריאה בלבד: שנו אותם במקום שבו הם מוגדרים ולחצו על „שחק”. הגנה משולבת בעיקולי המסלול, שמשדרגים עם כניסת הכסף, מנצחת את המשחק כברירת מחדל.
אתגר
קשהסיים את המשחק, ואז כוונן אותו בקוד שלך.
WaveSpawner: הוסףpublic event Action AllWavesCleared;, שיופעל אחרי הגל האחרון ברגע ש-Enemy.All.Count == 0(WaitUntil).GameManager: השאר את מספר החיים על 0 או יותר.End(message)מציג אתendPanelואתendTextשעברו סריאליזציה, ומגדיר אתTime.timeScale = 0:Game Overכשנותרו 0 חיים,You Win!לאחר שכל הגלים הסתיימו.public void PlayAgain():Time.timeScale = 1, ואז טען מחדש את הסצנה.
לחץ על „שחק” והגן על הבסיס לאורך כל שמונת הגלים. לאחר מכן לחץ על „בדיקה”.
נסו בעצמכם
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
[SerializeField] private int startMoney = 150;
[SerializeField] private int startLives = 20;
[SerializeField] private WaveSpawner spawner;
[SerializeField] private TMP_Text moneyText;
[SerializeField] private TMP_Text livesText;
[SerializeField] private TMP_Text waveText;
private int money;
private int lives;
void OnEnable()
{
Enemy.ReachedBase += OnReachedBase;
Enemy.Killed += OnKilled;
spawner.WaveStarted += ShowWave;
}
void OnDisable()
{
Enemy.ReachedBase -= OnReachedBase;
Enemy.Killed -= OnKilled;
spawner.WaveStarted -= ShowWave;
}
void Start()
{
money = startMoney;
lives = startLives;
ShowMoney();
ShowLives();
}
public bool TrySpend(int amount)
{
if (amount > money)
{
return false;
}
money -= amount;
ShowMoney();
return true;
}
public void Earn(int amount)
{
money += amount;
ShowMoney();
}
void OnKilled(Enemy enemy)
{
Earn(enemy.data.reward);
}
void OnReachedBase(Enemy enemy)
{
lives -= enemy.data.damage;
ShowLives();
}
void ShowMoney()
{
moneyText.text = "Money: " + money;
}
void ShowLives()
{
livesText.text = "Lives: " + lives;
}
void ShowWave(int wave, int total)
{
waveText.text = "Wave " + wave + "/" + total;
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה משחק Unity: הגנת מגדלים
תרגלו בעצמכם: Unity אונליין