Oculus Go 向けオンラインゲーム、「数字あて」の開発体験

こんにちは、コベリンの id:numanuma08 です。

コベリンでは以前から Unity を利用した Oculus 向けアプリケーションの開発をしていますが、今回はその一環でオンラインで遊ぶことのできるゲーム「数字あて」を開発しました。


VR数字あてゲーム

このゲームは限られた情報から自分の持っている手札の数字を予想して当てるというテーブルゲームのルールをベースに、 VR 空間上でプレイができるようにデザインをした物になります。

コベリンでは以前から Unity ハッカソンとして、Unity を使って好き勝手にゲームを作る取り組みを行っていました。

blog.covelline.com

blog.covelline.com

数字当てゲームはその延長線上の取り組みで、チームでの Unity アプリ開発を行うというチャレンジを行うものでした。

現時点での完成形が↑に貼り付けた動画となります。

アーキテクチャ

コベリンのメンバーは全員が Unity 経験者で、各々がアプリ開発を行った経験はあったもののチームとしての経験は皆無でした。そこで、先にアーキテクチャを決定してその流儀の中で開発を行いチームの効率を上げることにしました。

今回採用をしたアーキテクチャは MVP パターンです。アーキテクチャに沿った実装を行うために UniRx を利用しました。

github.com

MVP パターンでは Model から発せられたイベントを Presenter が受け取って、画面要素である Passive View を更新します。また、ユーザーの動作を Passive View が受け取ってそれをイベントとして Model へ伝達します。

今回は Presenter と Passive View を配置した scene をゲーム用のシーンとは独立して用意しました。こうすることで、 scene ファイルのコンフリクトを防ぎまたコンポーネント間の結びつきを弱くすることができました。

Presenter として用意したものは例えば、自分の数字を選択するときに使うパネル

f:id:numanuma08:20190618180404p:plain
数字パネル

あるいは、プレイヤーのアバターそのもの

f:id:numanuma08:20190618180620p:plain
アバター

ユーザーが操作可能なこういったオブジェクトを編集し、 UniRx を通じて model のコードと通信を行ってゲームを進めます。また、今回発生するイベントはユーザーが操作をするイベントだけではなく、インターネット越しの他のユーザーが操作をするイベントも含まれます。ネット越しのユーザーが発生させたイベントを同期するためのバックエンドとしては Photon を利用しました。

www.photonengine.com

Unity Multiplayer ではなく Photon を利用したのは、料金が安くて機能が十分だったためです。

このアーキテクチャの概念図は以下のようなものです。

f:id:numanuma08:20190618182411p:plain
概念図

  1. プレイヤーの一人が数字を選択すると、インターネット越しに全てのプレイヤーに対して選択した数字の情報が同期されます
  2. 「親プレイヤー」は選択された数字と、数字を選択したプレイヤーの手札の状態を確認します。手札に持っている数字を選択していたら、プレイヤーの手札から選択された数字を消します。
  3. 次のプレイヤーにターンを移します。

この概念図に登場する「親プレイヤー」は、ゲームのルール上は存在しないけれど、コードのデザインの都合上親プレイヤーを設定しておくことでプレイ中のセッションの切断と言った状態変化に対応ができるようになる存在です。

このアーキテクチャを採用することで、作業者は自分の関心のある scene や prefab に注力することができてブロックやコンフリクトを防ぐことができました。

今後の予定

今の所はこのアプリをストアに配信したり、公開をする予定はありません。しかし、将来的にコベリンでも VR 対応のゲームやコンテンツのリリースを行っていきたいと考えています。