Деньги
Урок 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 можно прочитать до создания экземпляра, чтобы решить, нужно ли его создавать.
Задание
СреднеУ игрока в начале 150 денежных единиц, а ArrowTower стоит 50.
- В
Towerдобавь открытый intcost. В префабе ArrowTower установи для него значение 50. - В
GameManagerдобавь сериализованные intstartMoneyи TMP_TextmoneyText, а также закрытый intmoney, которому при запуске присваивается значениеstartMoney. Отображай его какMoney: 150в начале и после каждого изменения. - Добавь
public bool TrySpend(int amount): еслиamountбольше, чем количество денег, верни false и ничего не меняй; иначе вычти эту сумму, отобрази количество денег и верни true. - В
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;
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.