游戏开发日记:实现胜利状态

在今天的开发日志中,将完成敌人生成系统,通过添加胜利状态来实现。让开始吧!

步骤1:创建胜利面板

首先,需要创建一个面板,告诉用户他们赢得了游戏。为了简化工作,将采取一个简单的方法,复制现有的“游戏结束”游戏对象,并重新利用它。目前,可以使用相同的脚本和动画器,因为它们做的事情是一样的。

要执行此操作,请在层级结构中选择“游戏结束”,然后按Ctrl + D进行复制。将副本重命名为“胜利”。它们都可以保留在画布中。

现在已经拥有了“胜利”面板,需要更改文本,以便玩家知道他们赢了。选择“胜利”>“文本”(不是按钮>文本),并将文字从“游戏结束”更改为“赢了!”

步骤2:编写代码以使用新的获胜面板

现在已经拥有了一个完全功能的获胜面板,是时候使用它了!需要更改两个脚本来实现这一点:

  • 游戏管理器(GameManager)
  • 生成管理器(SpawnManager)

首先,将设置游戏管理器使用胜利面板。以下是代码:

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的方式。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485