돈
Coddy의 Unity 게임: 타워 디펜스 코스 레슨. 18개 중 6번째.
타워를 건설하려면 돈이 듭니다. 돈은 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의 돈을 가지고 시작하고, ArrowTower의 비용은 50입니다.
Tower에 public intcost를 추가합니다. ArrowTower 프리팹의 값을 50으로 설정합니다.GameManager에 직렬화된 intstartMoney와 직렬화된 TMP_TextmoneyText, 그리고startMoney에서 시작하는 private intmoney를 추가합니다. 시작할 때와 값이 바뀔 때마다Money: 150으로 표시합니다.public bool TrySpend(int amount)를 추가합니다.amount가 보유한 돈보다 많으면 false를 반환하고 아무것도 변경하지 않습니다. 그렇지 않으면 해당 금액을 차감하고, 돈을 표시한 뒤 true를 반환합니다.BuildManager에 직렬화된 필드game(GameManager)을 추가합니다. 빈 건설 패드에는game.TrySpend가 프리팹의cost를 지불하는 경우에만 타워를 생성합니다. 그렇지 않으면Not enough money를 로그로 출력합니다.
Play를 눌러 돈이 바닥날 때까지 타워를 건설한 다음 Check를 누릅니다.
직접 해보기
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;
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.