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;
}

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

challenge icon

Задание

Средне

У игрока в начале 150 денежных единиц, а ArrowTower стоит 50.

  1. В Tower добавь открытый int cost. В префабе ArrowTower установи для него значение 50.
  2. В GameManager добавь сериализованные int startMoney и TMP_Text moneyText, а также закрытый int money, которому при запуске присваивается значение startMoney. Отображай его как Money: 150 в начале и после каждого изменения.
  3. Добавь public bool TrySpend(int amount): если amount больше, чем количество денег, верни false и ничего не меняй; иначе вычти эту сумму, отобрази количество денег и верни true.
  4. В BuildManager добавь сериализованное поле game (GameManager). Свободная площадка получает башню, только если game.TrySpend списывает стоимость префаба cost; в противном случае выведи в лог 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: защита башен