Menu
CoddyTech

Pieniądze

Lekcja 12 z 25 w kursie Gra w Unity: Obrona wieży 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

Wieże kosztują pieniądze: na początek 150, 50 za jedną Wieżę.

  1. Tower: dodaj public int cost = 50;.
  2. GameManager: dodaj [SerializeField] private int startMoney = 150;, [SerializeField] private TMP_Text moneyText; i private int money;, wyświetlane jako Money: 150.
  3. public bool TrySpend(int amount): zwróć false, jeśli amount > money; w przeciwnym razie odejmij tę kwotę, wyświetl ją i zwróć true.
  4. BuildManager: dodaj [SerializeField] private GameManager game;; buduj tylko wtedy, gdy game.TrySpend(towerPrefab.cost) zwróci true, w przeciwnym razie wyświetl komunikat Not enough money.

Naciśnij „Graj” i buduj, aż skończą się pieniądze. Następnie naciśnij „Sprawdź”.

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

Wszystkie lekcje w sekcji Gra w Unity: Obrona wieży

Poćwicz samodzielnie: Edytor online Unity