כסף
שיעור 12 מתוך 25 בקורס משחק Unity: הגנת מגדלים של Coddy.
מגדלים עולים כסף. הכסף שייך ל־GameManager, וה־BuildManager מבקש ממנו לשלם. הבקשה והתשלום מתבצעים בצעד אחד: מתודה שבודקת את כמות הכסף, לוקחת אותו אם יש מספיק, ומציינת באמצעות bool אם הצליחה, בדומה לתשובה של Dictionary.TryGetValue. הארנק של מכונת ממכר אוטומטית:
public bool TryPay(int price)
{
if (price > coins)
{
return false;
}
coins -= price;
coinText.text = coins + " coins";
return true;
}אף גורם שקורא למתודה לא יכול לשלם בלי הבדיקה, ומספר המטבעות לעולם לא יורד מתחת לאפס, כי שום דבר אחר לא משנה אותו. המחיר נמצא ב־prefab: שדה משלו בסקריפט שלו, שמוגדר ב־Inspector של ה־prefab. prefab הוא אובייקט שנטען כמו כל אובייקט אחר, ולכן אפשר לקרוא את snackPrefab.price לפני שיוצרים מופע שלו, כדי להחליט אם ליצור אותו.
אתגר
בינונימגדלים עולים כסף: 150 להתחלה, 50 לכל חץ.
Tower: הוסיפוpublic int cost = 50;.GameManager: הוסיפו[SerializeField] private int startMoney = 150;,[SerializeField] private TMP_Text moneyText;וגםprivate int money;, שמוצג בתורMoney: 150.public bool TrySpend(int amount): מחזירה false אםamount > money; אחרת מפחיתים את הסכום, מציגים אותו ומחזירים true.BuildManager: הוסיפו[SerializeField] private GameManager game;; בנו רק אםgame.TrySpend(towerPrefab.cost), אחרת רשמוNot enough money.
לחצו על "שחק" ובנו עד שהכסף ייגמר. לאחר מכן לחצו על "בדיקה".
נסו בעצמכם
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
[SerializeField] private int startLives = 20;
[SerializeField] private TMP_Text livesText;
private int lives;
void OnEnable()
{
Enemy.ReachedBase += OnReachedBase;
}
void OnDisable()
{
Enemy.ReachedBase -= OnReachedBase;
}
void Start()
{
lives = startLives;
ShowLives();
}
void OnReachedBase(Enemy enemy)
{
lives -= enemy.data.damage;
ShowLives();
}
void ShowLives()
{
livesText.text = "Lives: " + lives;
}
}
כל השיעורים ביחידה משחק Unity: הגנת מגדלים
תרגלו בעצמכם: Unity אונליין