腐りかけエンジニアのブログ

学生時代ろくに勉強してこなかった人間が、プログラムに挑戦してみる。

【Unity】コマンドパターンを使ってみる

なかなか設計について乏しいので、勉強したところを記事にしてみます!
最近LOLが始まり、また別で作っているゲームアプリがあるのでなかなか記事を書く時間がなく更新できませんでした・・・。

今回はコマンドパターンを使って、キャラクターを動かしてみたいと思います。
gyazo.com

コマンドパターンとは

あるオブジェクトに対して要求を送るということは、そのオブジェクトのメソッドを呼び出すことと同じです。 そして、メソッドにどのような引数を渡すか、ということによって要求の内容は表現されます。さまざまな要求を送ろうとすると、引数の数や種類を増やさなければなりませんが、 それには限界があります。そこで要求自体をオブジェクトにしてしまい、そのオブジェクトを引数に渡すようにします。それがCommandパターンです。

Commandパターンは、要求をCommandオブジェクトにして、それらを複数組み合わせて使えるようにするパターンです。

(引用して使わさせていただきました)

プレイヤークラスの実装

まずはキャラクターの基底クラスとプレイヤークラスを作っていきます。
CharaBaseを継承したプレイヤークラスにします。
また、今回はパターンの紹介なので、移動のみしか作っていません。
(この規模であれば、キャラクターの基底クラスはなくていいと思います・・・)

CharaBase

gist.github.com

プレイヤーの行動(コマンド)を表すクラスの実装

次にプレイヤーが起こす行動(コマンド)のクラスを実装していきます。
行動の基底クラスを作り、それを継承してそれぞれの行動を作っていきます。
引数にプレイヤーを入れることで、プレイヤーを簡単に変えることが可能です。
今回は移動のコマンドのみを作ってみます。

PlayerCommand

gist.github.com

MoveCommand

gist.github.com

プレイヤーの操作を受け取るクラスの実装

今度はプレイヤーの操作を受け取るクラスを作ります。
操作が実行されたら、プレイヤーのコマンドを返すようにします。
ここで先ほど作ったMoveCommandの参照をHierarchyで指定してあげられるようにします。
(今回は、矢印キーの右左を押されたらMoveCommandの参照を返り値で渡すようにしています)

PlayerInputHandler

gist.github.com

早速使ってみる

キャラクターを動かすために色々準備してあげましょう。

1.キャラクターを2体作り、プレイヤークラスをアタッチしましょう。
(見栄えを考慮してUnityのキャラクター達を使わさせて頂きました)
f:id:doggy_dog:20160315004535p:plain:w300f:id:doggy_dog:20160315004537p:plain:w315

2.次に、PlayerInputHandlerMoveCommandを空のオブジェクトとして作り、アタッチします。
また、PlayerInputHandlerのMoveCommandを指定してあげます。
f:id:doggy_dog:20160315005255p:plain:w330f:id:doggy_dog:20160315005256p:plain:w300

3.最後に操作するためのゲームシーンクラスを追加します。
UpdateのPlayerInputHandlerでプレイヤーの行動をフレーム毎に呼び、操作を受け取ります。
もし、操作していないのであれば、nullが返ってくるので動作は何もしません
移動を検知したのであれば、PlayerCommandを継承したMoveCommandが返り値としてくるので、移動がPlayerで実行されます。
gist.github.com

f:id:doggy_dog:20160315005541p:plain:w300

実行中にGameSceneにあるプレイヤーのインスペクターの参照をPlayer_2にしてあげることで操作できるプレイヤーを変えることができます。
gyazo.com

まとめ

これがコマンドパターンと呼べるかはわかりませんが、近いことはしていると思います。
プレイヤークラスに行動を直書きしていなく、綺麗にまとまっているのでいいかもしれません!

素材提供

コマンドパターンについて:22.Commandパターン | TECHSCORE(テックスコア)


f:id:doggy_dog:20160314002122p:plain

このコンテンツの一部には『ユニティちゃんライセンス』で許諾されたアセットが使用されています。
Portions of this work are licensed under Unity-Chan License