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

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

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

福岡インディーゲームエキスポ

12月17日に開催される福岡インディーゲームエキスポが待ち遠しい皆さんこんにちは。インディーゲームに関する展示会は既に幾つかで行われていますが、開催地が関東関西方面ばかりだったので九州の人間にとっては縁遠い存在でした。しかし、地元で開催されるという事でこれまで触れる機会が無かった国産インディーゲームを体験でき、開発者さんとも交流できるという事で今から楽しみで仕方ありません。

www.fukuoka-indiegame.com


私自身は今回の出展は見合わせたのですが、地元九州を中心に様々な開発者・チームが出展しているという事で昨今のインディーゲームの盛り上がりに興味のある方は会場を覗いてみてはどうでしょう?

 

全てが絵になるゲーム

ずっと以前から注目していたのですが、ようやく日本語化対応されたとの事で購入しました。

store.steampowered.com

砂漠の大地をホバーバイクで旅するアドベンチャーゲームで、バンド・デシネ風の絵作りが印象的なこのゲーム。
主人公Sableは部族の掟として独り部族を離れて旅に出る。旅の目的は「一生の生業を決めるため」、この世界の人間は皆が生業を象徴する仮面をかぶっており、その生業はこの旅を終えた後に決定する。
Sableは砂漠の世界を旅しながら様々な人と出会い、彼ら彼女らの依頼をこなし手助けをしながら自分の生業とは何かを考えていく。
といったストーリーを進めて行くアドベンチャーゲームなのですが、このゲームのウリはなんといってもその圧倒的な芸術性の高さで、ゲーム内のどの場面を切り取っても一枚のイラストが出来上がると思えるほど。

探索とパズルのような謎解きがメインとなっており、戦闘やサバイバルなどの要素は一切ありません。この為、人によってはゲーム内容が退屈に思えるかもしれませんが、ホバーバイクによる疾走、高所からのグライダー移動、スタミナが許す限り壁を上ることができるなど、異世界を自由気ままに旅する、異世界の建造物を思うままに探索する、といった楽しみ方に注視すれば十分なクオリティにあると思います。
目的を達成する為の手順、方法を楽しむことより世界観に浸れることを重視する雰囲気ゲームって今後もインディー界隈中心に増えていくのではないでしょうか。私もいつかこのようなゲームを作ってみたいものです。

 

デザインパターン

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

github.com

結構長い連載となりますが、ようやく終わりが見えてきました。

www.karvan1230.com

www.karvan1230.com

www.karvan1230.com

www.karvan1230.com

www.karvan1230.com

www.karvan1230.com

 

Observerパターン

Observerパターンとはシステム内の、あるクラスで起こったイベント(事象)を他のクラスが感知して、その後の処理を行う事を目的としたデザインパターンです。

出版-購読型モデルとも呼ばれることもあり、UnityではUniRxがこのデザインパターンの設計思想を具現化して、より使いやすい形に纏められています。

 

例えば、子供がお使いを頼まれてスーパーマーケットに出かける場合、何もしなければスーパーマーケットにたどり着いたとしても、行列が出来ていた等々の理由により目的の商品が品切れになっているケースも考えられます。

 

この為、事前に「子供がお使いに出かける」ことを察した親(=Subject)が事前にスーパーマーケット(=Observer)にお使いの内容を通知して、スーパーマーケット(=Observer)は子供が到着する前に目的の商品を準備しておきます。そうすることで「子供のお使い」はスムーズに目的を達成する事ができます。

つまり、Observerパターンを導入することで「出発」→「到着」→「購入」のシーケンシャルな動作と並行して「準備」の処理を非同期で行うことが可能となるわけです。
また、「準備」を行うのは一つのスーパーマーケットに限らず、複数の店舗で行うことも可能となります。

 

サンプルシーン

このデザインパターンの基本は、イベントを通知される側(=Observer)のクラスインスタンスを、通知する側(=Subject)のクラスインスタンスに登録することにあります。

サンプルシーンではSubject側のアイコンをクリックすると、Subject側アイコンのアニメーションと同時にObserver側のスピーカーからパーティクルが再生され、(GIFなので音がでないけど)音声も流れることが確認できます。

 

この「アイコンのアニメーション」「パーティクル再生」「音声鳴動」はそれぞれObserverのクラスとして実装されており、各クラスのAwake(起動時に呼ばれる関数)内にてSubjectクラスの定義済デリゲート(Action)のClickedイベントに各クラスのイベント受信時処理(OnThingHappend)を登録しています。

Subject側のアイコンをクリックすると、Subjectクラスにて定義済デリゲート(Action)のInvokeコールしてAwakeで登録された各Observerクラスのイベント受信時処理が呼び出されていますInvokeはNULL許容型でコールされている事に注意が必要です。

 

まとめ

Observerパターンとは通知側(=Subject)と観察側(=Observer)の2つの役割が存在し、SubjectからObserverに通知されるデザインパターンです。

通常はObserver側のインスタンスをSubject側に登録することで通知を可能としています。

サンプルシーンでは定義済デリゲート(Action)を使い、Invokeコールで通知を行っています。

 

◇プライバシーポリシー

●個人情報の利用目的

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

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

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

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

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

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

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

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

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

●免責事項

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

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

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

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

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

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