Menu
CoddyTech

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ć.

challenge icon

Wyzwanie

Średni

Gracz zaczyna z 150 jednostkami pieniędzy, a ArrowTower kosztuje 50.

  1. W Tower dodaj publiczne pole typu int cost. Prefab ArrowTower ustawia jego wartość na 50.
  2. W GameManager dodaj serializowane pole typu int startMoney oraz serializowane pole typu TMP_Text moneyText, a także prywatne pole typu int money, którego początkową wartością jest startMoney. Wyświetlaj jego wartość jako Money: 150 na początku i po każdej zmianie.
  3. Dodaj public bool TrySpend(int amount): gdy amount jest 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.
  4. W BuildManager dodaj serializowane pole game (typu GameManager). Wolne pole budowy otrzymuje wieżę tylko wtedy, gdy game.TrySpend pobierze koszt prefabrykatu cost; w przeciwnym razie zapisz w logu Not 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;
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Gra Unity: Obrona wieżowa