Appearance
第08回 GameManagerとゲーム状態SystemsのHierarchy
5 / 5 Scene設定と動作確認
このステップの目的
GameManagerをSceneへ設定し、すべての状態遷移と停止処理を確認します。
SceneへGameManagerを設定する
- Hierarchyに
Systemsがない場合は、ルートに空のGameObjectを作成してSystemsと名付けます - Hierarchyの
Systemsを右クリックし、空のGameObjectを作成します - 名前を
Game Managerに変更します GameManagerコンポーネントを追加しますPlayer Damage ReceiverへPlayerのDamageReceiverをドラッグしますPlayer ControllerへPlayerのPlayerControllerをドラッグしますEnemy SpawnerへScene上のEnemySpawnerをドラッグしますClear Defeat Countを10にします- Enemy Prefabが配布版
Enemy.csを使用していることを確認します - Sceneを保存します
- Systems
- Enemy Spawner
- Heal Item Pool
- Item Drop System
- Game Manager
状態遷移をPlay Modeで確認する
この回ではGameManagerの状態を画面上に表示するUIは実装されていません。GameManagerのStateをInspectorで確認できるよう、必要ならDebug表示へ切り替えるか、ChangeState()へ一時的なDebug.Logを追加します。
| 操作 | 期待する状態と結果 |
|---|---|
| Playを開始する | ReadyからPlayingへ遷移する |
| Enemyを1体倒す | 状態はPlayingのまま、撃破数だけ増える |
| 10体目を倒す | GameClearへ遷移し、Player操作、Enemy生成、Enemy行動が止まる |
| 再度Playし、PlayerのHPを0にする | GameOverへ遷移し、Player操作とEnemyのゲームプレイ処理が止まる |
| 終了後に待つ | 状態と撃破数が変化しない |
クリアとゲームオーバーが近いタイミングで発生した場合は、最初に遷移した終了状態が維持され、あとから別の結果へ変化しないことも確認します。
確認後は一時的なログを削除します。次回、状態と撃破数を画面へ表示します。
実習:遷移表とコードを対応させる
- 遷移表の各行に対応するコード行を探します
CanTransition()からReady → Playingを一時的に削除します- Playして警告と状態を確認します
- 条件を元へ戻します
Clear Defeat Countを1と5で比較します- 状態、遷移条件、遷移時処理を自分の言葉で説明します
動作しない場合のチェックリスト
Playingへ遷移しない
- Consoleに許可されていない遷移の警告がないか
CanTransition()にReady → Playingがあるか- Game Managerが有効か
撃破数が増えない
- Enemy Prefabが第08回の
Enemy.csを使用しているか - GameManagerが
OnEnable()でイベントを購読しているか DamageReceiverが死亡時にDiedを発行しているか- Enemyが
DamageReceiver.Diedを購読しているか
ゲームオーバーにならない
Player Damage ReceiverへPlayer自身のコンポーネントを設定したか- Playerの
CurrentHealthが実際に0になっているか - GameManagerがPlayerの
DamageReceiver.Diedを購読しているか
終了後も移動する
Player Controller参照が設定されているかEnemySpawner.StopGameplay()が呼ばれているか- Enemy Prefabに
EnemyControllerが追加されているか - 独自に追加した行動コンポーネントにも停止処理が必要ではないか
完成条件
- 状態、遷移、遷移条件、遷移時処理の違いを説明できる
Ready → Playing → GameClearとReady → Playing → GameOverを確認できる- Enemyの撃破がGameManagerに通知され、撃破数が集計される
- 許可されていない状態遷移を拒否できる
- GameManagerが個別キャラクターの行動処理を持っていない
まとめ
- ステートマシンの基本的な構成要素を理解し実装した
- 個別キャラクターの状態とScene全体の状態を分離した
- Enemyは事実を通知し、GameManagerがゲームルールとして勝敗を決定した
- 終了処理を集約し、多重実行と不正な遷移を防いだ
チェックリスト
Ready → Playing → GameClearとReady → Playing → GameOverの両方を確認できる。