在今天的开发日志中,将完成敌人生成系统,通过添加胜利状态来实现。让开始吧!
首先,需要创建一个面板,告诉用户他们赢得了游戏。为了简化工作,将采取一个简单的方法,复制现有的“游戏结束”游戏对象,并重新利用它。目前,可以使用相同的脚本和动画器,因为它们做的事情是一样的。
要执行此操作,请在层级结构中选择“游戏结束”,然后按Ctrl + D进行复制。将副本重命名为“胜利”。它们都可以保留在画布中。
现在已经拥有了“胜利”面板,需要更改文本,以便玩家知道他们赢了。选择“胜利”>“文本”(不是按钮>文本),并将文字从“游戏结束”更改为“赢了!”
现在已经拥有了一个完全功能的获胜面板,是时候使用它了!需要更改两个脚本来实现这一点:
首先,将设置游戏管理器使用胜利面板。以下是代码:
using UnityEngine;
public class GameManager : MonoBehaviour
{
public Animator GameOverAnimator;
public Animator VictoryAnimator;
private GameObject _player;
void Start()
{
_player = GameObject.FindGameObjectWithTag("Player");
}
public void GameOver()
{
GameOverAnimator.SetBool("IsGameOver", true);
DisableGame();
}
public void Victory()
{
VictoryAnimator.SetBool("IsGameOver", true);
DisableGame();
}
private void DisableGame()
{
_player.GetComponent().enabled = false;
_player.GetComponentInChildren().enabled = false;
_player.GetComponentInChildren().enabled = false;
Cursor.lockState = CursorLockMode.None;
}
}
唯一的新代码是添加了VictoryAnimator,就像GameOverAnimator一样,这是胜利面板的动画器。
现在游戏管理器可以播放胜利动画了,需要在赢得游戏时从生成管理器调用它。以下是这方面的代码:
using System.Collections;
using UnityEngine;
[System.Serializable]
public class Wave
{
public int EnemiesPerWave;
public GameObject Enemy;
}
public class SpawnManager : MonoBehaviour
{
public Wave[] Waves;
public Transform[] SpawnPoints;
public float TimeBetweenEnemies = 2f;
private GameManager _gameManager;
private int _totalEnemiesInCurrentWave;
private int _enemiesInWaveLeft;
private int _spawnedEnemies;
private int _currentWave;
private int _totalWaves;
void Start()
{
_gameManager = GetComponentInParent();
_currentWave = -1;
_totalWaves = Waves.Length - 1;
StartNextWave();
}
void StartNextWave()
{
_currentWave++;
if (_currentWave > _totalWaves)
{
_gameManager.Victory();
return;
}
_totalEnemiesInCurrentWave = Waves[_currentWave].EnemiesPerWave;
_enemiesInWaveLeft = 0;
_spawnedEnemies = 0;
StartCoroutine(SpawnEnemies());
}
IEnumerator SpawnEnemies()
{
GameObject enemy = Waves[_currentWave].Enemy;
while (_spawnedEnemies < _totalEnemiesInCurrentWave)
{
_spawnedEnemies++;
_enemiesInWaveLeft++;
int spawnPointIndex = Random.Range(0, SpawnPoints.Length);
Instantiate(enemy, SpawnPoints[spawnPointIndex].position, SpawnPoints[spawnPointIndex].rotation);
yield return new WaitForSeconds(TimeBetweenEnemies);
}
yield return null;
}
public void EnemyDefeated()
{
_enemiesInWaveLeft--;
if (_enemiesInWaveLeft == 0 && _spawnedEnemies == _totalEnemiesInCurrentWave)
{
StartNextWave();
}
}
}
在代码中,创建了一个新的private _gameManager,这将是访问GameManager的方式。