福岡インディーゲームエキスポ
12月17日に開催される福岡インディーゲームエキスポが待ち遠しい皆さんこんにちは。インディーゲームに関する展示会は既に幾つかで行われていますが、開催地が関東関西方面ばかりだったので九州の人間にとっては縁遠い存在でした。しかし、地元で開催されるという事でこれまで触れる機会が無かった国産インディーゲームを体験でき、開発者さんとも交流できるという事で今から楽しみで仕方ありません。
私自身は今回の出展は見合わせたのですが、地元九州を中心に様々な開発者・チームが出展しているという事で昨今のインディーゲームの盛り上がりに興味のある方は会場を覗いてみてはどうでしょう?
全てが絵になるゲーム
ずっと以前から注目していたのですが、ようやく日本語化対応されたとの事で購入しました。
砂漠の大地をホバーバイクで旅するアドベンチャーゲームで、バンド・デシネ風の絵作りが印象的なこのゲーム。
主人公Sableは部族の掟として独り部族を離れて旅に出る。旅の目的は「一生の生業を決めるため」、この世界の人間は皆が生業を象徴する仮面をかぶっており、その生業はこの旅を終えた後に決定する。
Sableは砂漠の世界を旅しながら様々な人と出会い、彼ら彼女らの依頼をこなし手助けをしながら自分の生業とは何かを考えていく。
といったストーリーを進めて行くアドベンチャーゲームなのですが、このゲームのウリはなんといってもその圧倒的な芸術性の高さで、ゲーム内のどの場面を切り取っても一枚のイラストが出来上がると思えるほど。
探索とパズルのような謎解きがメインとなっており、戦闘やサバイバルなどの要素は一切ありません。この為、人によってはゲーム内容が退屈に思えるかもしれませんが、ホバーバイクによる疾走、高所からのグライダー移動、スタミナが許す限り壁を上ることができるなど、異世界を自由気ままに旅する、異世界の建造物を思うままに探索する、といった楽しみ方に注視すれば十分なクオリティにあると思います。
目的を達成する為の手順、方法を楽しむことより世界観に浸れることを重視する雰囲気ゲームって今後もインディー界隈中心に増えていくのではないでしょうか。私もいつかこのようなゲームを作ってみたいものです。
デザインパターン
さてさて、Unity公式から公開されているデザインパターン学習用のサンプルプロジェクトについての記事、今回で7回目になるでしょうか。
結構長い連載となりますが、ようやく終わりが見えてきました。
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コールで通知を行っています。