こんにちハロー
ゼロカロリーのジュースは口の中がベトベトしませんね
今回はコマンドパターンをUnityで実際に使用したときの備忘録です.
参考文献
コマンドパターンはこの本で知りました.
ゲーム開発関係なく,プログラマにはおススメの本です!
Game Programming Patterns ソフトウェア開発の問題解決メニュー impress top gearシリーズ
- 作者:Robert Nystrom
- 発売日: 2015/09/24
- メディア: Kindle版
この記事読むよりおススメです! doggy.hatenablog.com
コマンドパターンとは
リクエストのために必要な手続きをCommandオブジェクトとしてカプセル化した上で取り回し[1]、必要に応じてExecute(実行)するパターンである。
オブジェクトであることを生かして命令のキューイングやロギング、Undo等が可能になり[2]、Executeを分離したことで手続きと実行を疎結合にできる。
関係ないですが「Wikipediaは信用できない」とよく言われていますが,個人的には技術記事に関しては信用できると思っています.
実装
作るもの
とりあえず下記の処理を実装してみます.
1. 十字キーでプレイヤ移動する.
2. Bキーでプレイヤがアイテムを持つ.(Log出力だけ)
3. Bキーでプレイヤがアイテムを置く.(Log出力だけ)
キャラクタの基底クラス
今回は操作するプレイヤだけですが,敵(エネミー)を作る際にも使用できるように基底クラスを定義します.
プレイヤクラス
プレイヤ専用みたいになっていますが,エネミーにも使用できます.(多分)
キャラクタの振舞い(コマンド)クラス
「実行」と「実行取り消し」のみの抽象クラスです.
移動コマンド
回転コマンド
持ち上げコマンド
持ち下げコマンド
プレイヤの入力処理を行うクラス
入力に応じたコマンドを返す処理を記述します.
プレイヤは入力装置を使用します.
また,エネミーの場合は,プレイヤの入力判定部分にAIを記述することになると思います.
今回はリストでコマンドを管理していますが,参考文献に挙げた本ではコマンドをnewしており,コマンド履歴を保持するようになっています.
自分もnewするようにするのが便利だと思いますが,UnityではGCが走るので良くないのかなと思って辞めました.
詳しい方に教えていただきたいです.
シーン管理を行うクラス
ここにコマンドを走らせる処理を記述します.
いわゆるゲームの進行管理を行うクラスだと思います.
Unity上の設定
Player
PlayerController.csをアタッチします.
PlayerInputHandler
親にPlayerInputHandler.cs,子に各種Command.csをアタッチします.
GameScene
PlayerInputHandlerとPlayerのprefabをアタッチします.
Scene配置
今回は,実行時にPlayerInputHandlerとPlayerを生成するようにしたので,基本はGameSceneプレハブを配置するだけです.
あとは,必要に応じてカメラや床などを配置してます.
実行
十字キーで移動できます.
まとめ
コマンドパターンを使用したプレイヤ処理を行いました.
EnemyInputHandler.csを作成して,その中にエネミーのAIを記述することで,ほかのスクリプトをいじらずにAI処理が記述できます.
あとは,今までPlayerController.csのUpdate内でいろいろ記述していた処理がなくなり,スクリプトが簡潔になったのが良いですね.
Undoの処理は適当ですが,雰囲気が伝われば幸いです.
プログラムの設計から今まで逃げてきましたが,一度しっかり勉強する必要があるな~と改めて実感しました.