돈
Coddy의 Unity 게임: 타워 디펜스 코스 레슨. 25개 중 12번째.
타워를 건설하려면 돈이 듭니다. 돈은 GameManager에 있고, BuildManager는 GameManager에 지불을 요청합니다. 요청과 지불은 한 단계로 이루어집니다. 돈이 있는지 확인하고, 충분하면 돈을 가져간 다음, 지불했는지 bool로 알려주는 메서드입니다. Dictionary.TryGetValue가 답하는 방식과 같습니다. 자판기의 지갑은 다음과 같습니다.
public bool TryPay(int price)
{
if (price > coins)
{
return false;
}
coins -= price;
coinText.text = coins + " coins";
return true;
}호출자는 확인 절차 없이 지불할 수 없으며, 다른 어떤 것도 동전을 변경하지 않으므로 동전 수는 절대 0보다 낮아지지 않습니다. 가격은 프리팹에 있습니다. 프리팹의 Inspector에서 설정하는 자체 스크립트의 필드입니다. 프리팹도 다른 객체와 마찬가지로 로드된 객체이므로, 인스턴스화하기 전에 snackPrefab.price를 읽어 인스턴스화할지 결정할 수 있습니다.
챌린지
중급타워를 건설하려면 돈이 듭니다. 시작할 때 150이 있고, 화살 하나당 50이 듭니다.
Tower:public int cost = 50;을 추가합니다.GameManager:[SerializeField] private int startMoney = 150;,[SerializeField] private TMP_Text moneyText;,private int money;를 추가하고,Money: 150으로 표시합니다.public bool TrySpend(int amount):amount > money이면 false를 반환하고, 그렇지 않으면 해당 금액을 차감하고 표시한 뒤 true를 반환합니다.BuildManager:[SerializeField] private GameManager game;을 추가합니다.game.TrySpend(towerPrefab.cost)가 true일 때만 건설하고, 그렇지 않으면Not enough money를 로그에 출력합니다.
‘플레이’를 누르고 돈이 다 떨어질 때까지 건설합니다. 그런 다음 ‘확인’을 누릅니다.
직접 해보기
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;
}
}
Unity 게임: 타워 디펜스의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드