おもちゃバコ

中身スカスカ♡

Unity: コマンドパターンでプレイヤを管理する

こんにちハロー
ゼロカロリーのジュースは口の中がベトベトしませんね

今回はコマンドパターンをUnityで実際に使用したときの備忘録です.

参考文献

コマンドパターンはこの本で知りました.
ゲーム開発関係なく,プログラマにはおススメの本です!

この記事読むよりおススメです! doggy.hatenablog.com


コマンドパターンとは

Command パターン - Wikipedia より

リクエストのために必要な手続きをCommandオブジェクトとしてカプセル化した上で取り回し[1]、必要に応じてExecute(実行)するパターンである。
オブジェクトであることを生かして命令のキューイングやロギング、Undo等が可能になり[2]、Executeを分離したことで手続きと実行を疎結合にできる。

関係ないですが「Wikipediaは信用できない」とよく言われていますが,個人的には技術記事に関しては信用できると思っています.


実装

作るもの

とりあえず下記の処理を実装してみます.
1. 十字キーでプレイヤ移動する.
2. Bキーでプレイヤがアイテムを持つ.(Log出力だけ)
3. Bキーでプレイヤがアイテムを置く.(Log出力だけ)

キャラクタの基底クラス

今回は操作するプレイヤだけですが,敵(エネミー)を作る際にも使用できるように基底クラスを定義します.

プレイヤクラス

プレイヤ専用みたいになっていますが,エネミーにも使用できます.(多分)

キャラクタの振舞い(コマンド)クラス

「実行」と「実行取り消し」のみの抽象クラスです.

移動コマンド

回転コマンド

持ち上げコマンド

持ち下げコマンド

プレイヤの入力処理を行うクラス

入力に応じたコマンドを返す処理を記述します.
プレイヤは入力装置を使用します.
また,エネミーの場合は,プレイヤの入力判定部分にAIを記述することになると思います.

今回はリストでコマンドを管理していますが,参考文献に挙げた本ではコマンドをnewしており,コマンド履歴を保持するようになっています.

自分もnewするようにするのが便利だと思いますが,UnityではGCが走るので良くないのかなと思って辞めました.
詳しい方に教えていただきたいです.

シーン管理を行うクラス

ここにコマンドを走らせる処理を記述します.
いわゆるゲームの進行管理を行うクラスだと思います.


Unity上の設定

Player

PlayerController.csをアタッチします.
f:id:lambda410:20210509155633p:plain

PlayerInputHandler

親にPlayerInputHandler.cs,子に各種Command.csをアタッチします.
f:id:lambda410:20210509155749p:plain
f:id:lambda410:20210509155856p:plain

GameScene

PlayerInputHandlerとPlayerのprefabをアタッチします.
f:id:lambda410:20210509160201p:plain

Scene配置

今回は,実行時にPlayerInputHandlerとPlayerを生成するようにしたので,基本はGameSceneプレハブを配置するだけです.
あとは,必要に応じてカメラや床などを配置してます.
f:id:lambda410:20210509160428p:plain


実行

十字キーで移動できます.
f:id:lambda410:20210509160353p:plain


まとめ

コマンドパターンを使用したプレイヤ処理を行いました.

EnemyInputHandler.csを作成して,その中にエネミーのAIを記述することで,ほかのスクリプトをいじらずにAI処理が記述できます.
あとは,今までPlayerController.csのUpdate内でいろいろ記述していた処理がなくなり,スクリプトが簡潔になったのが良いですね.

Undoの処理は適当ですが,雰囲気が伝われば幸いです.

プログラムの設計から今まで逃げてきましたが,一度しっかり勉強する必要があるな~と改めて実感しました.