原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】公式サンプルプロジェクトから学ぶデザインパターン:Command

ブログ

不意に10年ぐらい前に書いていたブログを読み返してみると今と全く状況が変わってなくて泣きそうな皆さんこんにちは。

こんなAA描いてた

デザインパターン

と、いうわけでUnity公式から公開されているデザインパターン学習用のサンプルプロジェクトについての記事5回目です。

github.com

これまでの記事はこちら

www.karvan1230.com

www.karvan1230.com

www.karvan1230.com

www.karvan1230.com

Commandパターン

Commandパターンは、処理の呼び出し側と実装側を分離することを目的としたデザインパターンで、プロダクト内で行う処理を細かい命令(Command)に細分化し、それをそのままオブジェクトとして表現するパターンです。

命令を1つの「オブジェクト」として表現することにより命令の履歴管理を行うことが可能で、それによって命令の訂正、再実行などが容易になります。

 

例えばレストランでは注文を受けてシェフが料理を作りますが、料理には「肉料理」「魚料理」「野菜料理」等々種類が多様で、それぞれで作業工程、内容が異なります。
しかし、そういった作業内容はシェフ自身が把握していれば良いので、お客側から「鶏肉に小麦粉をまぶして油で揚げて調理して」といった指示を受ける必要はありません。
お客側は「唐揚げ」という料理名を注文するだけで自分が希望する料理が出されるわけです。

こうしたお客(Client)とシェフ(Receiver)間で決められた料理名(Command)で指示→実行を行うパターンがCommandパターンと言えますが、シェフが一人でお客が複数の場合、そのままではシェフがワンオペで複数の料理を同時にこなさなければならず混乱してしまいます。
この為、Commandパターンではお客(Client)とシェフ(Receiver)の間に給仕役(Invoker)を置き、お客からの注文に順序を付けてシェフに料理の依頼を行います。

上の図でいうと伝票がCommandの役割を担っています。伝票は図の通り順番に並べられているため、それが注文履歴となり以後の履歴管理に利用することができます。

 

サンプルシーン

サンプルプロジェクトの「9 Command」ディレクトリ配下にあるサンプルシーンは以下のよう動作をします。

画面左下にある各方向ボタンをクリックすると「P」のマークの自機がその方向へ移動します。Undo,Redoは実行した命令の訂正、再実行を行います。

Pマークの自機にはPlayerMoverというコンポーネントがアタッチされており、上位から移動方向を指定されるとその方向へ移動する処理が組み込まれています。

 

このサンプルシーンではボタンクリックのイベントをInputManagerが受け取るとボタンに応じたMoveCommandを生成し、CommandInvokerに対してMoveCommandの実行依頼します。

また、依頼されたMoveCommandはCommandInvoker内でスタック領域に保持されているため、Undoがクリックされた場合、スタック領域から直近のMoveCommandを取り出し(POP)て、そこから逆方向の移動処理を依頼しています。

これらのモジュールの関係を図で表現するとこんな感じになります。

 

まとめ

Commandパターンは命令を1つの「オブジェクト」として表現するデザインパターンです。

このパターンは処理の呼び出し側と実装側を分離し、命令の履歴管理、Undo/Redoを容易にするという利点があります。

処理のどこからどこまでをコマンド化するのか検討する必要があり、検討が足りないとコードが複雑化する可能性があります。

 

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。