Pieniądze
Lekcja 6 z 18 w kursie Gra Unity: Obrona wieżowa w Coddy.
Wieże kosztują pieniądze. Pieniądze należą do GameManagera, a BuildManager prosi go o zapłatę. Prośba i zapłata to jeden krok: metoda, która sprawdza stan pieniędzy, pobiera je, jeśli jest ich wystarczająco dużo, i zwraca wartość typu bool informującą, czy to zrobiła — tak jak odpowiada Dictionary.TryGetValue. Portfel automatu:
public bool TryPay(int price)
{
if (price > coins)
{
return false;
}
coins -= price;
coinText.text = coins + " coins";
return true;
}Żaden kod wywołujący nie może zapłacić bez sprawdzenia, a liczba monet nigdy nie spadnie poniżej zera, ponieważ nic innego jej nie zmienia. Cena jest zapisana w prefabie: w polu własnego skryptu, ustawionym w Inspektorze prefabu. Prefab to załadowany obiekt, taki jak każdy inny, więc można odczytać snackPrefab.price przed utworzeniem jego instancji, aby zdecydować, czy należy ją utworzyć.
Wyzwanie
ŚredniGracz zaczyna z 150 jednostkami pieniędzy, a ArrowTower kosztuje 50.
- W
Towerdodaj publiczne pole typu intcost. Prefab ArrowTower ustawia jego wartość na 50. - W
GameManagerdodaj serializowane pole typu intstartMoneyoraz serializowane pole typu TMP_TextmoneyText, a także prywatne pole typu intmoney, którego początkową wartością jeststartMoney. Wyświetlaj jego wartość jakoMoney: 150na początku i po każdej zmianie. - Dodaj
public bool TrySpend(int amount): gdyamountjest większe niż ilość pieniędzy, zwróć false i niczego nie zmieniaj; w przeciwnym razie odejmij tę kwotę, wyświetl ilość pieniędzy i zwróć true. - W
BuildManagerdodaj serializowane polegame(typu GameManager). Wolne pole budowy otrzymuje wieżę tylko wtedy, gdygame.TrySpendpobierze koszt prefabrykatucost; w przeciwnym razie zapisz w loguNot enough money.
Naciśnij Play i buduj, aż skończą się pieniądze, a następnie naciśnij Check.
Spróbuj swoich sił
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;
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.