みなさん,MetaQuest3でVR/MRアプリケーションを作成したことはありますか?作ったことがあるならマルチプレイヤーのゲームを作成したいですよね?(圧)また,プレイヤー以外のオブジェクトの位置を共有することも可能です.このように複数の実行環境でさまざまなことを共有するアプリを作成するための基礎を紹介します!
本記事ではMetaQuest3のVRプラットフォームとMRプラットフォームでPhoton PUN2 を使用して3Dオブジェクトの位置を共有する方法について記載する.
MR側の作成方法
まずMR側のセットアップ方法を行う.以下の記事ですでに説明をしている.参照してください.
本記事執筆時はUnity6がリリースされていた.以下の記事はちょっと古いUnityを使っているためUIが変わっている部分が多々ありますが,文字での補足をしています.
また以下の記事でMetaQuest3側でインターネット通信ができるようにするための環境構築の説明をしている.
「ビルド設定とMeta環境設定」の見出しを参照してください.
Photon PUN2のセットアップはMRとVRともに共通なので最後に記載しています.
VRプロジェクトのセットアップ
Unity Asset StoreでMeta All-in-One SDK
を取得する.
https://assetstore.unity.com/packages/tools/integration/meta-xr-all-in-one-sdk-269657
Unity Assetとは
ゲームやアプリケーション開発に役立つ様々なデジタル素材の総称.具体的には,3Dモデル,テクスチャ,スプライト,アニメーション,サウンドエフェクト,音楽,スクリプト,シェーダー,プレハブなど,Unityプロジェクトで使用できるあらゆるものが含まれる.Meta All-in-One SDKはMetaQuestを用いて開発するためのAssetである.
マイアセットに追加してUnityエディターでマイアセット内のAssetをインポートする流れである.
UnityIDの作成を求められた場合作成すること
その後,Unityエディターに戻ってWindow
- Package Manager
を押す.
Packages: In Project
を選択し,My Assets
を選択する.
Meta XR ALL-in-One SDK
を選択してinstall
を押す.
次にFile
を選択してBuild Settings
を押す.
Android
を選択してSwitch Platform
を押す.
Player Seting...
を選択し,Meta XR
を選択し,’Androidマーク’
を選択し,Fix All
とApply All
を押してさまざまなエラーや問題を修正したものを適用する.
Projectビュー内でOVRCameraRig(Packages/com.meta.xr.sdk.core/Prefabs/OVRCameraRig.prefab)
を検索し.OVRCameraRig
とOVRSceneManager
をAssetsにドラッグ&ドロップする.
Search:
がIn Packages
になっているかどうか確認すること
Assetsフォルダを開くと以下のようになっている.OVRCameraRig
とOVRSceneManager
が追加されているか確認する.
次に"Assets"フォルダ内のOVRCameraRig
とOVRSceneManager
をhierarchyビューのSampleScene
に追加して,MainCamera
を削除する.必要に応じてOVRCameraRig
の位置を調節する.OVRSceneManager
は変更不要である.
hierarchyビューのOVRCameraRig
を選択してinspectorビューでTarget Devices
のQuest3
にチェックする.
inspectorビューでScene Support
とをRequired
にする.
XR Plug-in Managementをinstallしておく.
VR側でもMetaQuest3側でインターネット通信ができるようにするための設定が必要なので,以下の記事の「ビルド設定とMeta環境設定」の見出しを参照してください.
以上でVRのセットアップは完了である.
シーンの保存を忘れないでね
Photon PUN2のセットアップ
ここからはPhoton PUN2のセットアップを行う.この操作はVRとMR両方のアプリケーションで同じ操作をする.
Photonカウントの作成とアプリケーションの作成
ここではPhotonアカウントの作成を行い,Photonアプリケーションの作成を行う.本記事ではPhotonの中でも特にPUN2というフレームワークを使用する.
Photon PUN2とは
Unity のマルチプレイヤーゲーム開発を支援するためのネットワーキングフレームワーク.Photon Cloud を介してリアルタイム通信を実現するための豊富な API と簡便なワークフローが提供されるため, Photon Cloudに接続するために同一の AppId を設定し,その中の同一の Room への接続を通して複数のクライアント間の通信が容易に管理される仕組みである.
Photon Cloudとは
Photonが提供するクラウドサービスであり, リアルタイムマルチプレイヤーゲームの接続管理やサーバー機能をクラウド上で提供するプラットフォームである, 開発者は自前のサーバー環境を構築する手間を省き, グローバルに分散されたサーバー群によって安定した通信を実現することが可能である
Photon PUN2 における AppId の考え方
Photon Cloud に接続するための固有の識別子であり, 各プロジェクトに固有であるため, 正しい AppId を設定することで他のプロジェクトと混在せずに接続が行われる仕組みである.
Photon PUN2 における Room の考え方
Room は, リアルタイム通信を行う際の仮想的な空間であり, プレイヤーが同一の Room に参加することで状態の同期や通信が実現される, Room ごとに参加人数や設定が管理されており, 必要に応じて Room の作成や参加が自動的に行われる仕組みである.
Photonのアカウントを作成する.
「Create a new app」を選択し,Photon アプリケーションを作成する.
このようにアプリケーションが作成される.この上部にあるApp IDが今後必要になるのでどこかに控えておくこと
Unity Asset StoreでPUN2を取得
以下のアセットをUnity Assets Storeでマイアセットに追加する.
今回は無料版を使用します
Photon コスト
ここでPhotonを使用するにあたってのコストを説明します.先ほども述べた通り,本記事では無料版(20 CCU)のものを使用します.
引用
https://www.photonengine.com/ja-jp/pun/pricing
2025年2月24日時点の情報です
Photon PUBLIC CLOUD GAMING For Development Only
Plan | CCU(同時接続数) | License/Billing | Price | Validity | Monthly Transfer Limit | Other Details |
---|---|---|---|---|---|---|
20 CCU(月額) | 20 | Development Only | Free | - | 60.0 GB/月 | 同時に最大20人の接続 開発目的のみ CCUバーストなし |
Photon PUBLIC CLOUD GAMING For Launch
Plan | CCU(同時接続数) | License/Billing | Price | Validity | Monthly Transfer Limit | Other Details |
---|---|---|---|---|---|---|
100 CCU(月額) | 100 | ONE-TIME | ¥22,416 | 12ヶ月間 | 0.3 TB/月 | 同時に最大100人の接続 ゲーム専用 最適MAU: 〜40k CCUバーストなし |
500 CCU (月額) | 500 | Monthly | ¥22,416 | 月単位 | 1.5 TB/月 | 同時に最大500人の接続 ゲーム専用 最適MAU: 〜200k CCUバースト含む 追加購入(1GBあたり): • Europe/Canada, East / RU / RUE / USA (East/West): ¥11.80 • Asia / Australia / China / India / Japan / South Africa / South America / South Korea / Turkey / UAE: ¥23.60 |
1000 CCU (月額) | 1000 | Monthly | ¥43,651 | 月単位 | 3.0 TB/月 | 同時に最大1,000人の接続 ゲーム専用 最適MAU: 〜400k CCUバースト含む 追加購入(1GBあたり): • Europe/Canada, East / RU / RUE / USA (East/West): ¥11.80 • Asia / Australia / China / India / Japan / South Africa / South America / South Korea / Turkey / UAE: ¥23.60 |
2000 CCU (月額) | 2000 | Monthly | ¥87,302 | 月単位 | 6.0 TB/月 | 同時に最大2,000人の接続 ゲーム専用 最適MAU: 〜800k CCUバースト含む 追加購入(1GBあたり): • Europe/Canada, East / RU / RUE / USA (East/West): ¥11.80 • Asia / Australia / China / India / Japan / South Africa / South America / South Korea / Turkey / UAE: ¥23.60 |
Photon PREMIUM CLOUD FOR GAMING Pricing
Plan | Billing Model | Price | Included Features | Other Details |
---|---|---|---|---|
PREMIUM CLOUD FOR GAMING (Usage-Based) | 毎CCU請求 | ¥68.20 / CCU | - | 毎月の使用量ベース 最大50,000 CCUまで自動調整 |
PREMIUM CLOUD FOR GAMING (Minimum Fee) | 最低料金 | ¥136,400/月 | 2,000 CCU + 6.0 TB転送量 3.0 GB/ピークCCU/月 |
ゲーム専用 同時最大2,000人の接続 適用MAU: 20m 使用量ベースのCCUオートスケーリング 50,000 CCU以上のバースト デフォルトのDDoS保護 |
UnityプロジェクトにPhotonフレームワークを適用
ここからはUnityプロジェクトにPhotonフレームワークを適用するフェーズです.Metaの設定はVRプロジェクトのセットアップ で済んでいるものとします.
Window
→Package Manager
を選択.
My Assets
→ PUN2 - FREE
をインストールする.
Window
→Photon Unity Networking
→PUN Wizard
を選択
Setup Project
を選択.
先ほどメモしたApp IDを入力してSetup Project
を選択する.
するとAssets/Photon/PhotonUnityNetworking/Resources/PhotonServerSettings.asset
が作成される.
Assets/Photon/以下ファイルはPUN2 - FREE アセットをインストールした時点で作成済みである
PhotonServerSettings.asset
のApp Id PUN
が先ほど入力した’App IDと一致するかを確認する.
実際にPhotonで通信するオブジェクトの設置
ここからは実際にPhotonで通信(複数クライアント間で位置の同期など)をするオブジェクトを設置する.
-
HierarchyビューでSphere(3Dオブジェクトならなんでもいいです)を設置する.
-
inspectorビューで
Add Component
を選択し,Photon View
とPhoton Transform View
をアタッチする.
アニメーションも同期させたい場合は
Photon Animation View
もアタッチする.
- inspectorビューにあるsphereをドラッグ&ドロップで
Assets/Resources
ディレクトリに設置する.
Photon PUN2の仕様上Assets/Resources
ディレクトリにオブジェクトがないとPhotonが認識しないみたいです.Assets/Resources
ディレクトリに必ずPrefab化をしましょう.
(任意)通信失敗用のオブジェクトを設置する
inspectorビューにcube(3Dオブジェクトなら...(以下略))を設置.
このオブジェクトはPhotonの通信とは関係ないので何も
Add Component
しなくていいです.またPrefabの位置もAssets/Resoueces
以下ディレクトリでなくてもいいです...
通信用のGameManagerの作成
inspectorビューで空のGame Object(Create Empty
)を作成する.
任意のディレクトリに以下のC#スクリプトを設置する.
スクリプト名は
PhotonGameManager.cs
にしています
Photon.Punのメソッドをオーバーライドしています.詳しいスクリプトの内容は別の記事で紹介しようと思います.
using Photon.Pun;
using Photon.Realtime;
using UnityEngine;
public class PhotonGameManager : MonoBehaviourPunCallbacks
{
public GameObject PhotonObject;
public GameObject PhotonFailureObject;
void Start()
{
PhotonNetwork.ConnectUsingSettings();
}
// ルームに参加する処理
public override void OnConnectedToMaster()
{
// 固定ルーム "SampleRoomName" に参加
PhotonNetwork.JoinRoom("SampleRoomName");
}
// ルーム参加に失敗した場合(通常,指定したルーム名が存在しなかった場合)の処理
public override void OnJoinRoomFailed(short returnCode, string message)
{
// ルーム参加に失敗した場合はルームを新規作成(最大8人まで)
RoomOptions roomOptions = new RoomOptions();
roomOptions.MaxPlayers = 8;
PhotonNetwork.CreateRoom("SampleRoomName", roomOptions);
}
// ルーム参加に成功した時の処理
public override void OnJoinedRoom()
{
if (PhotonObject == null)
{
Debug.LogError("PhotonObject is not set in the inspector.");
return;
}
// ルームに入室できたら、PhotonObject(本記事ではSphere)を生成する
PhotonNetwork.Instantiate(PhotonObject.name, new Vector3(0f, 0f, 0f), Quaternion.identity, 0);
}
// OnDisconnectedという名前だがルーム切断時のみではなく接続失敗時にも実行する処理
public override void OnDisconnected(DisconnectCause cause)
{
base.OnDisconnected(cause);
Debug.LogError("Disconnected from Photon: " + cause.ToString());
// 接続に失敗した場合、PhotonFailureObject(本記事ではCube) を表示する
if (PhotonFailureObject != null)
{
// ローカルにオブジェクトを Instantiate する例(PhotonNetwork.Instantiate は使用できないため)
Instantiate(PhotonFailureObject, new Vector3(0f, 0f, 0f), Quaternion.identity);
}
else
{
Debug.LogError("PhotonFailureObject is not set in the inspector.");
}
}
}
このスクリプトを先ほど作成した空のGameObjectにAdd Component
でアタッチする
inspectorビューでPhoton Object
に先ほど作成したSphereをアタッチ.
(任意)Photon Failure Object
に先ほど作成したCube
をアタッチ.
ここまでをVR側のプロジェクトとMR側のプロジェクトで同じように設定すること.
これでPhotonの通信部の設定は完了です.
ビルドと実行
File
→Build Profiles
を選択
Platfolms
をAndroid
にしてBuild And Run
を選択してMetaQuest3で実行する.
これでVR側とMR側の両方にSphereがあれば成功である.
エラーハンドリング
- VR側とMR側の両方の
Assets/Resources
にPhotonで通信する同じオブジェクトがあることはないですか?
結構忘れがちです