나만의 것으로 만들기
Coddy의 Unity 게임: 타워 디펜스 코스 레슨. 25개 중 25번째.
게임에는 엔딩이 필요합니다. 목숨이 0이 되면 패배하고, 모든 웨이브가 전송되고 남은 적이 없으면 승리합니다. 스포너는 WaitUntil을 사용해 보드가 비기를 기다립니다. 이 함수는 매 프레임 람다를 확인한 다음 이벤트를 발생시킵니다.
yield return new WaitUntil(() => switchesOn == switches.Length);어느 쪽으로 끝나든 EndPanel을 표시하고 Time.timeScale = 0으로 게임을 멈춥니다. 목숨이 1 남았을 때 탱크가 2의 피해를 주면 정확히 0인지 확인하는 검사를 건너뛸 수 있으므로, Mathf.Max를 사용해 목숨이 0 이상으로 유지되게 합니다. Time.timeScale은 씬을 불러와도 값을 유지하므로, 다시 플레이할 때는 먼저 1로 되돌립니다.
이제 게임을 나만의 방식으로 만들어 보세요. 여기서는 플레이어의 Inspector가 읽기 전용이므로 startMoney(150), startLives(20), timeBetweenWaves(8)에 코드의 값을 사용합니다. 선언된 위치에서 값을 바꾸고 ‘플레이’를 누르세요. 길의 굽은 곳에 여러 종류의 방어 시설을 배치하고 돈이 들어오는 대로 업그레이드하면 기본 게임보다 더 잘할 수 있습니다.
챌린지
어려움게임을 종료한 다음 코드에서 조정하세요.
WaveSpawner:Enemy.All.Count == 0이 된 후 마지막 웨이브가 끝나면 발생하는public event Action AllWavesCleared;를 추가하세요(WaitUntil).GameManager: 목숨이 0 이상이 되도록 유지하세요.End(message)는 직렬화된endPanel과endText를 표시하고Time.timeScale = 0으로 설정합니다. 목숨이 0이면Game Over, 모든 웨이브를 클리어하면You Win!을 표시하세요.public void PlayAgain():Time.timeScale = 1로 설정한 다음 씬을 다시 불러오세요.
‘플레이’를 눌러 여덟 웨이브 모두에서 기지를 방어하세요. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
[SerializeField] private int startMoney = 150;
[SerializeField] private int startLives = 20;
[SerializeField] private WaveSpawner spawner;
[SerializeField] private TMP_Text moneyText;
[SerializeField] private TMP_Text livesText;
[SerializeField] private TMP_Text waveText;
private int money;
private int lives;
void OnEnable()
{
Enemy.ReachedBase += OnReachedBase;
Enemy.Killed += OnKilled;
spawner.WaveStarted += ShowWave;
}
void OnDisable()
{
Enemy.ReachedBase -= OnReachedBase;
Enemy.Killed -= OnKilled;
spawner.WaveStarted -= ShowWave;
}
void Start()
{
money = startMoney;
lives = startLives;
ShowMoney();
ShowLives();
}
public bool TrySpend(int amount)
{
if (amount > money)
{
return false;
}
money -= amount;
ShowMoney();
return true;
}
public void Earn(int amount)
{
money += amount;
ShowMoney();
}
void OnKilled(Enemy enemy)
{
Earn(enemy.data.reward);
}
void OnReachedBase(Enemy enemy)
{
lives -= enemy.data.damage;
ShowLives();
}
void ShowMoney()
{
moneyText.text = "Money: " + money;
}
void ShowLives()
{
livesText.text = "Lives: " + lives;
}
void ShowWave(int wave, int total)
{
waveText.text = "Wave " + wave + "/" + total;
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
Unity 게임: 타워 디펜스의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드