כסף
שיעור 6 מתוך 18 בקורס משחק 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, הוסףcostמסוגintציבורי. ה־prefab של ArrowTower מגדיר אותו ל־50. - ב־
GameManager, הוסףstartMoneyמסוגintמסודר בסריאליזציה ו־moneyTextמסוגTMP_Textמסודר בסריאליזציה, וכןmoneyמסוגintפרטי שמתחיל ב־startMoney. הצג אותו כ־Money: 150בתחילת המשחק ואחרי כל שינוי. - הוסף
public bool TrySpend(int amount): כאשרamountגדול מכמות הכסף, החזר false ואל תשנה דבר; אחרת, הפחת אותו, הצג את כמות הכסף והחזר true. - ב־
BuildManager, הוסף שדה מסודר בסריאליזציה בשםgame(מסוג GameManager). משבצת פנויה מקבלת מגדל רק אםgame.TrySpendמשלם את ה־costשל ה־prefab; אחרת, רשום ביומןNot enough money.
לחץ על Play ובנה עד שייגמר הכסף, ואז לחץ על Check.
נסו בעצמכם
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;
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.