LIFULL Creators Blog

「株式会社LIFULL(ライフル)」の社員によるブログです。

オンラインVRを作る~1.PUN2を使おう~

はじまして、プロダクトエンジニアリング部の関川です。
最近はテレワークの影響で、めっきり外に出ることが少なくなり、会議もzoomなどを用いたものがほとんどです。 巷ではVR空間で会議するなどを一部の企業が取り入れているようでwithコロナの新しい風を感じます。 そんなオンラインVRが導入されるのはまだ先の話の方が多そうですが、まず自作で体験してみるのはどうしょうか? そのための技術の選定や簡単なPUNを用いたプロジェクトの作成方法をまとめたので試してみてください。 また今回は導入ですが、次回の記事でoculusを用いたオンラインVRを作成していきます。

オンラインVRを作成する場合に上がるBaaS技術

VRを作成するといえばいろいろな開発環境想像される方は多いですが、 今回のターゲット開発環境はUnityです。

開発環境 Unity2019.4.15f1

VRオンラインサービスを作るとなると
・サーバーはどう用意する?
・費用は?
などを考える必要があり、一気にハードルが上がるイメージですが そんなときに利用したいのがネットワークエンジンライブラリ。 ライブラリの導入は爆速でネットワーク問題を解決してくれます。 Unityに対応したネットワークエンジンは複数あり、その概要と個人的見解などを紹介します。 結論から書くとタイトルにある通り、PUN2はいいです。

PUN(Photon)

Photon Unity Networking

Photonは世界No.1の独立系リアルタイムネットワークエンジンです。そのUnity用パッケージをPUNと呼びます。 フレームワークとしてPUNとPUN2があり、今からやるならPUN2を推奨します。 photonはマルチプレイヤーでのゲームを可能にし、あらゆるプラットフォームのゲームに対応しています。(PC、スマホ、家庭ゲームなど) また機能として、ユーザー数に応じた自動スケーリング、ランダムマッチなどを可能にするマッチメイキングAPIなど開発を支援するものが盛りだくさん。 個人的にはアセンブリが整理されていてテスト書きやすそうという部分が大きいです。

MUN

Monobit Unity Networking

マルチプレイを簡単に実装できるUnity専用の無料アセットです。 日本の開発ということもあり、法人へのサポート体制がかなりしっかりしていそうです。利用料もPUN2と変わらず、過去に違いと言われてたUDP通信非対応はMUN2では対応されたため、いよいよPUN2との差がほんとにすくない印象なのですが 個人単位でのドキュメントとかがあまり見られないので、学習面を考えると日本語、英語合わせて文献豊富なPUN推しです。

UNet

Unity5.x系の最大の産物。 Unity公式のネットワークエンジン。 この項目で伝えたいことは

UNet は非推奨となり、今後 Unity から削除される予定です。新しいシステムが開発中です。

ただこれはよく使われていたBaaSなので、PUNもMUNもこれをベースに作られています。 故にUNetの記事は調べると今でもかなり出てきますし、たまにPUNと偽って出てくる時があるので注意です。 チュートリアルとかも手厚いのでネットワークエンジンの基礎を学びたい方はここをあえてやるのもいいのかもしれないです。

Mirror

UNetからの移行をするユーザーのためのOSSのネットワークフレームワークです。 これ単体ではPUNなどと違い、インターネット経由の通信はできず、LAN内環境で動かすことができます(逆にPUNはPhoton server経由がマスト)。 そのため、 インターネット環境を必要としないのは魅力的ですが、サーバーも別容易となるとオンラインVRを爆速で作るには学習コストが高いですね。 個人的には文献もさほど多いとは言えないのとUNetから入らないと「Mirrorワカラナイ」になりそうなのでここでもPUN推し。

結論:PUN2を使う

PUN2とMUNはほんとに近い物で、選ぶときは少し迷いましたが、やはり困ったときの文献の量は非常に大きいので、今回はPUN2を用います。 そのためPUN2についてもう少し掘り下げて行きます。

PUN2とは

仕組み

PUN2は極力開発者の負担を減らすため、構造すら公式チュートリアルで「気にする必要がない」と明言しているくらい開発者は意識せずとも作成できます。
そのため、ここで理解しておかないといけないのはPhotonのマスターサーバーとロビーとルームの概念です。 マスターサーバーはPhotonに対するすべての通信を管理している立場であり、複数のゲームサーバーが存在しています。 その先にゲーム単位など個々のロビーが存在しています。 さらにそのロビーの先にプレイヤー同士が集うルームがあるイメージです。 Photonはこの概念が重要なの覚えておくとよいです。

利用料

PUN2自体は無料ですが、Photon Cloud自体は料金表が存在します。 利用料は従量課金性で、指標としてCCU(Concurrent Users:同時接続ユーザー数)と転送量が出てきます。 利用プランとして 20CCUまでは無料枠として使うことができるので、開発などの段階やお試しが可能です。 詳しい料金に関してとPUN plusに関しては今回のスコープから外しますので、 こちらを参考にしてください。

PUN2でオンラインの空間を作る

VR開発を行う上だとどのデバイスに対応しようとかはあるのですが 今回はまずオンラインゲームを作る大まかな部分を手順を解説していきます。

まずは登録・ルームサーバーを立てる

ここら辺は大体のPUN2に関しての他の記事で書かれているので割愛しますが大まかな流れだけ共有します。 ボイスチャットを用いるので二つのアプリケーションidを作成してください。
1. Photonの公式サイトに入り、右上の会員登録を済ます。
2. マイダッシュボードへ行き、新しいアプリケーションを作成しアプリケーションIDをコピーする。
3. Photon Voiceのアプリケーションを作成して、アプリケーションIDをコピーする。
f:id:LIFULL-sekikaws:20210325151410p:plain

プロジェクト作成する

unityを立ち上げプロジェクトは3Dで作成します。 プロジェクトにasset storeからPUN2とPhoto Voice 2をインストールして、 各IDを入力してください。

サーバーとの接続はこれ一行

PhotonControllerという名の空オブジェクトを作成おいて、 scriptsファイルにC#コードを追加 Photonのネームスペースを追加して一行。

PhotonNetwork.ConnectUsingSettings();

これをシーン開始の"start"の中に仕込めば完了。

ルーム作成とジョインのコールバック定義

次にマスターサーバーへ接続完了した後のコールコールバックを定義します。 動きとしては、 1.マスターサーバーに入って、ルームがあれば入る 2.なければ作成してルームに入る という流れ。 コールバックが爆速に早くなったのがPUN2のPUNとの違いだそうです。

public class MatchMaker : MonoBehaviourPunCallbacks
{
    // アバター
    public GameObject PhotonObject;

    void start (){
     PhotonNetwork.ConnectUsingSettings();
    }
    // マスターサーバーに接続したとき
    public override void OnConnectedToMaster()
    {
    // ルームがないならルームを作り,あとならそのままルームに入る
        PhotonNetwork.JoinOrCreateRoom("room",new RoomOptions(),TypedLobby.Default);
    }
    // ルームに入ったとき
  public override void OnJoinedRoom()
    {
        // アバター(オブジェクト)を作成する
        PhotonNetwork.Instantiate(PhotonObject, Vector3.zero, Quaternion.identity,0);
    }
    
}

photonサーバー設定を行う

photon server setttingsを探し以下のように設定を行います。App IDを設定していればJPサーバーに設定を変更するだけでよいです。 Photon VoiceのAppIDも忘れずに入力しましょう。 f:id:LIFULL-sekikaws:20210325195935p:plain

状態共有するには?(オンラインゲーム化)

アバターとして扱うゲームオブジェクトはprefab化しておきます。 また共有したい情報によりますが、アバターなど人型の場合,add componetから "Photon view"と "Photon TransormView"と"PhotoAnimatorView"を追加します。 さらに"Audio Source"と"Photon Voice Speaker"をボイスチャット用に着けます。 f:id:LIFULL-sekikaws:20210325185614p:plain

実行する

オブジェクトにスクリプトを結び付けなどを行い、 アプリケーションをビルドして最低二つのアプリでログインし、同一空間にアバターが二つあり、声が届いていれば成功です。

まとめ

爆速でのオンラインツールを開発可能にするのがPUN2の強みです。 ぜひ一度やってみてはいかがでしょうか? 今回はオンラインVRを作成する前段階としてオンラインゲームを作成しましたが 次回はoculusのデバイスを用いて、オンラインVR作成する手順を解説したいと思います。