Appearance
第08回 GameManagerとゲーム状態
4 / 5 ゲームプレイを停止する
このステップの目的
Player、Enemy、Spawnerへ明示的な停止処理を追加します。
操作対象を明示してゲームプレイを停止する
PlayerControllerに入力と進行中の攻撃を停止する関数を追加します。
PlayerController.cscs
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 void SetActionEnabled(bool actionEnabled)
{
if (!actionEnabled)
characterAttack.CancelAttack();
enabled = actionEnabled;
}EnemySpawnerは、自分が生成して管理しているEnemyへ停止を伝えてから、自身の生成処理を無効にします。
EnemySpawner.cscs
public void StopGameplay()
{
CleanupDestroyedEnemies();
foreach (var enemy in _aliveEnemies)
enemy.GetComponent<EnemyController>()?.SetActionEnabled(false);
enabled = false;
}結果画面のUI、Button、停止させる必要がない演出などは通常どおり動作できます。
Time.timeScaleによる全体停止について
Time.timeScaleはUnityの時間進行速度を変更するプロパティです。ポーズ機能などを実装する際に便利ですが、Scene全体に影響するグローバルな設定であるため、無関係な移動、Animator、Particle System、Coroutine、物理処理など広範囲に影響します。また、複数コンポーネントが同時に操作することを防げませんので、Sceneを切り替えても設定が意図せず残るなど原因を追いにくい不具合につながる危険があります。
ゲーム全体で時間倍率の変更箇所を厳密に制御できていない限り、使用は避けた方が安全です。通常のゲーム状態切り替えでは、今回のように停止対象へ明示的なメソッドを用意した方が良いかもしれません。
この教材では、ゲーム停止の手段としては使用しません。
チェックリスト
結果表示などを動かしたまま、Player操作、Enemy行動、Enemy生成だけを停止できる。