Menu
CoddyTech

כסף

שיעור 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 לפני שיוצרים מופע שלו, כדי להחליט אם ליצור אותו.

challenge icon

אתגר

בינוני

השחקן מתחיל עם 150 כסף, ומגדל חצים עולה 50.

  1. ב־Tower, הוסף cost מסוג int ציבורי. ה־prefab של ArrowTower מגדיר אותו ל־50.
  2. ב־GameManager, הוסף startMoney מסוג int מסודר בסריאליזציה ו־moneyText מסוג TMP_Text מסודר בסריאליזציה, וכן money מסוג int פרטי שמתחיל ב־startMoney. הצג אותו כ־Money: 150 בתחילת המשחק ואחרי כל שינוי.
  3. הוסף public bool TrySpend(int amount): כאשר amount גדול מכמות הכסף, החזר false ואל תשנה דבר; אחרת, הפחת אותו, הצג את כמות הכסף והחזר true.
  4. ב־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;
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה משחק Unity: הגנת מגדלים