Menu
CoddyTech

Tiền

Bài học 12 trên 25 trong khóa học Game Unity: thủ thành của Coddy.

Tháp tiêu tốn tiền. GameManager giữ tiền, còn BuildManager yêu cầu GameManager thanh toán. Yêu cầu và thanh toán gộp trong một bước: một phương thức kiểm tra số tiền, trừ tiền nếu đủ và cho biết bằng kiểu bool việc đó có thành công hay không, giống cách Dictionary.TryGetValue trả lời. Ví tiền của máy bán hàng tự động:

public bool TryPay(int price)
{
    if (price > coins)
    {
        return false;
    }

    coins -= price;
    coinText.text = coins + " coins";
    return true;
}

Mọi nơi gọi phương thức đều phải kiểm tra trước khi thanh toán, và số xu không bao giờ xuống dưới 0 vì không có gì khác thay đổi số xu. Giá nằm trên prefab: một trường trong script riêng của prefab, được thiết lập trong cửa sổ Inspector của prefab. Prefab là một đối tượng đã tải như mọi đối tượng khác, nên bạn có thể đọc snackPrefab.price trước khi tạo đối tượng, để quyết định có nên tạo hay không.

challenge icon

Thử thách

Trung bình

Tháp tốn tiền: bắt đầu với 150, mỗi tháp Arrow tốn 50.

  1. Tower: thêm public int cost = 50;.
  2. GameManager: thêm [SerializeField] private int startMoney = 150;, [SerializeField] private TMP_Text moneyText; và private int money;, hiển thị dưới dạng Money: 150.
  3. public bool TrySpend(int amount): trả về false nếu amount > money; nếu không, trừ khoản tiền đó, hiển thị số tiền còn lại rồi trả về true.
  4. BuildManager: thêm [SerializeField] private GameManager game;; chỉ xây tháp nếu game.TrySpend(towerPrefab.cost) trả về true, nếu không thì ghi nhật ký Not enough money.

Nhấn Chơi rồi xây tháp cho đến khi hết tiền. Sau đó nhấn Kiểm tra.

Tự làm thử

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

Tất cả bài học trong Game Unity: thủ thành

Tự luyện tập: Playground Unity