Menu
CoddyTech

Деньги

Урок 12 из 25 курса Игра на Unity: Tower Defense на Coddy.

Башни стоят денег. Деньги принадлежат GameManager, а BuildManager просит его заплатить. Запрос и оплата — это один шаг: метод, который проверяет количество денег, списывает их, если их достаточно, и сообщает с помощью bool, удалось ли заплатить, как это делает Dictionary.TryGetValue. Кошелёк торгового автомата:

public bool TryPay(int price)
{
    if (price > coins)
    {
        return false;
    }

    coins -= price;
    coinText.text = coins + " coins";
    return true;
}

Ни один вызывающий код не сможет заплатить без проверки, и количество монет никогда не станет меньше нуля, потому что больше ничто его не меняет. Цена хранится в префабе: это поле собственного скрипта префаба, заданное в Inspector префаба. Префаб — это загруженный объект, как и любой другой, поэтому значение snackPrefab.price можно прочитать до создания экземпляра, чтобы решить, нужно ли его создавать.

challenge icon

Задание

Средне

Башни стоят денег: 150 на старте, 50 за одну башню-стрелка.

  1. Tower: добавь public int cost = 50;.
  2. GameManager: добавь [SerializeField] private int startMoney = 150;, [SerializeField] private TMP_Text moneyText; и private int money;, отображаемое значение — Money: 150.
  3. public bool TrySpend(int amount): возвращает false, если amount > money; иначе вычитает эту сумму, отображает её и возвращает true.
  4. BuildManager: добавь [SerializeField] private GameManager game;; строй башню, только если game.TrySpend(towerPrefab.cost) возвращает true, иначе выведи в журнал 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: Tower Defense

Потренируйтесь самостоятельно: Песочница Unity