Personalize
Lição 25 de 25 do curso Jogo de Unity: Defesa de Torres da Coddy.
O jogo precisa de um final. Você perde quando as vidas chegam a 0 e vence quando todas as ondas tiverem sido enviadas e não restar nenhum inimigo. O spawner espera o tabuleiro ficar vazio com WaitUntil, que verifica uma lambda a cada quadro, e então dispara um evento:
yield return new WaitUntil(() => switchesOn == switches.Length);Qualquer um dos finais exibe o EndPanel e para o jogo com Time.timeScale = 0. Um Tank que recebe 2 de dano quando resta 1 vida ultrapassaria uma verificação por exatamente 0, então Mathf.Max mantém as vidas em 0 ou mais. Time.timeScale mantém seu valor ao carregar uma cena, então “Jogar novamente” primeiro o redefine para 1.
Agora personalize o jogo. Aqui, startMoney (150), startLives (20) e timeBetweenWaves (8) usam os valores do seu código, já que o Inspector deste jogador é somente leitura: altere-os onde são declarados e pressione “Jogar”. Uma defesa variada nas curvas do caminho, aprimorada conforme o dinheiro chega, supera o jogo padrão.
Desafio
DifícilEncerre o jogo e, em seguida, ajuste-o no seu código.
WaveSpawner: adicionepublic event Action AllWavesCleared;, acionado após a última onda, quandoEnemy.All.Count == 0(WaitUntil).GameManager: mantenha as vidas em 0 ou mais.End(message)exibeendPaneleendTextserializados e defineTime.timeScale = 0:Game Overquando houver 0 vidas eYou Win!quando todas as ondas forem concluídas.public void PlayAgain():Time.timeScale = 1e, em seguida, recarregue a cena.
Pressione “Jogar” e defenda a base durante todas as oito ondas. Em seguida, clique em “Verificar”.
Experimente você mesmo
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;
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Jogo de Unity: Defesa de Torres
Pratique por conta própria: Playground de Unity