第08回 GameManagerとゲーム状態
4 / 5 ゲームプレイを停止する
このステップの目的
Player、Enemy、Spawnerへ明示的な停止処理を追加します。
操作対象を明示してゲームプレイを停止する
PlayerController.csのクラス内に、変数とSetControlEnabled()を追加してください。既存のUpdate()の先頭には、入力処理を中断する条件を加えます。クラスやUpdate()をもう一つ作る必要はありません。CancelAttack()は、第06回で作った処理を使います。
PlayerController.cscs
public class PlayerController : MonoBehaviour
{
private bool _controlEnabled = true;
public void SetControlEnabled(bool controlEnabled)
{
_controlEnabled = controlEnabled;
if (!controlEnabled)
characterAttack.CancelAttack();
}
private void Update()
{
if (!_controlEnabled)
return;
// 既存の入力処理
}PlayerController自体は有効なままにし、Update()内の入力処理だけを止めます。発展版のAnimatorを使っている場合も、ゲーム終了後に状態を更新できます。
EnemyControllerにも、攻撃と行動更新を止める関数を追加してください。進行中の攻撃も中断します。
EnemyController.cscs
public class EnemyController : MonoBehaviour
{
public void SetActionEnabled(bool actionEnabled)
{
if (!actionEnabled)
characterAttack.CancelAttack();
enabled = actionEnabled;
}EnemySpawnerでは、生成して管理している各Enemyの停止用メソッドを呼び出します。その後、EnemySpawner自身を無効にして、新たなEnemyの生成を止めます。
EnemySpawner.cscs
public class EnemySpawner : MonoBehaviour
{
public void StopGameplay()
{
CleanupDestroyedEnemies();
foreach (var enemy in _aliveEnemies)
enemy.GetComponent<EnemyController>()?.SetActionEnabled(false);
enabled = false;
}結果画面のUIやButton、止める必要のない演出は、通常どおり動かせます。Time.timeScaleを変えると、Scene内の時間を使う処理に広く影響します。そのため今回は、Playerの操作、Enemyの行動、Enemyの生成を、それぞれのメソッドで止めます。
ここまでの編集でコンパイルエラーを解消してください。その後、目標撃破数を1にして敵を倒し、ゲームクリアを試します。Playerが倒れてゲームオーバーになる場合も、別に試してください。
どちらの場合も、終了後は移動や攻撃を入力しても動かず、敵の生成も止まることを確認します。確認を終えたら、目標撃破数を元の値へ戻してください。
チェックリスト
- 結果表示などを動かしたまま、Player操作、Enemy行動、Enemy生成だけを停止できる。