הפוך את זה לשלך
שיעור 18 מתוך 18 בקורס משחק Unity: הגנת מגדלים של Coddy.
למשחק דרוש סיום. מפסידים כשהחיים מגיעים ל־0, ומנצחים כשכל הגלים נשלחו ולא נשארו אויבים בלוח. המשגר יודע מתי הגל האחרון יצא, ו־Enemy.All יודע כמה אויבים נשארו, לכן המשגר ממתין עד שהלוח מתרוקן ואז מעלה אירוע ש־GameManager מאזין לו. קורוטינה ממתינה לתנאי באמצעות WaitUntil, שבודק למבדה פעם אחת בכל פריים. חדר חידות שפותח את היציאה שלו כשכל המתגים מופעלים:
yield return new WaitUntil(() => switchesOn == switches.Length);
exit.SetActive(true);כל אחד מהסיומים מציג את EndPanel עם הודעה ועוצר את המשחק באמצעות Time.timeScale = 0. מספר החיים לעולם לא יורד מתחת ל־0: טנק שסופג 2 כשנשארו חיים אחד היה מדלג ישר מעבר לבדיקה של 0 בדיוק, לכן Mathf.Max משאיר אותם על 0 או יותר.
״שחק שוב״ טוען את הסצנה מחדש. Time.timeScale אינו חלק מהסצנה ושומר על הערך שלו גם לאחר הטעינה, לכן משחק שעצר ב־0 יתחיל שוב כשהוא קפוא: יש להחזיר אותו ל־1 לפני הטעינה.
עכשיו הפכו את המשחק לשלכם. כל מה שמשפיע על האיזון שלו נמצא ב־Inspector:
- GameManager של המשחק:
startMoney(150) ו־startLives(20). - ה־
wavesשל המשגר: שמונה שורות של אויבים, כמות ומרווח, ו־timeBetweenWaves(8). - נכסי EnemyData: מהירות, בריאות, תגמול ומספר החיים שכל סוג גורע. לבוס יש 450 בריאות והוא גורע 10.
- נכסי TowerData: עלות, נזק, טווח, קצב ירי, מספרי השדרוג, אזור הפגיעה של התותח וההאטה של מגדל הכפור.
אפשר לנצח עם ערכי ברירת המחדל בעזרת הגנה משולבת בפיתולי המסלול, שמשדרגים ככל שמגיע כסף; כמה מגדלים מסוג אחד לא יחזיקו מעמד. שנו מספר אחד בכל פעם, ושחקו כדי להרגיש את ההשפעה שלו.
אתגר
קשה- ב־
WaveSpawner, הוסףpublic event Action AllWavesCleared. אחרי שליחת הגל האחרון, המתן עד ש־Enemy.Allיהיה ריק, ואז הפעל את האירוע. - ב־
GameManager, הוסף את השדות המסודריםendPanel(מסוג GameObject) ו־endText(מסוג TMP_Text). מספר החיים לעולם לא יורד מתחת ל־0, וכשהוא מגיע ל־0 המשחק מסתיים עםGame Over. כשכל הגלים מסתיימים ונשארו חיים, המשחק מסתיים עםYou Win!. בסיום, הצג את החלונית עם ההודעה והגדר אתTime.timeScaleל־0. - כתוב
public void PlayAgain(), שהכפתור בחלונית יפעיל: החזר את הזמן למצב רגיל וטען שוב את הסצנה הפעילה.
לחץ על Play והגן על הבסיס לאורך כל שמונת הגלים, ואז לחץ על Check. לאחר מכן, כוונן את המשחק ב־Inspector ושחק בדרך שלך.
נסו בעצמכם
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
[SerializeField] private int startMoney = 100;
[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;
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.