Skip to content
第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生成だけを停止できる。