1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MetaQuest3のMRとVRでPhoton PUN2を使用してオブジェクトの位置共有をしてみよう

Last updated at Posted at 2025-02-24

みなさん,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である.

マイアセットに追加するを押す.
スクリーンショット 2024-04-08 15.18.44.png

マイアセットに追加してUnityエディターでマイアセット内のAssetをインポートする流れである.

UnityIDの作成を求められた場合作成すること

その後,Unityエディターに戻ってWindow - Package Managerを押す.

スクリーンショット 2024-04-08 15.47.27.png

Packages: In Projectを選択し,My Assetsを選択する.

スクリーンショット 2024-04-08 15.50.15.png

Meta XR ALL-in-One SDK を選択してinstallを押す.

スクリーンショット 2024-04-08 16.05.05.png

次にFileを選択してBuild Settingsを押す.

スクリーンショット 2024-04-08 16.11.30.png

Androidを選択してSwitch Platformを押す.

スクリーンショット 2024-04-08 16.11.58.png

Player Seting...を選択し,Meta XRを選択し,’Androidマーク’を選択し,Fix AllApply Allを押してさまざまなエラーや問題を修正したものを適用する.

スクリーンショット 2024-04-08 16.19.38.png

Projectビュー内でOVRCameraRig(Packages/com.meta.xr.sdk.core/Prefabs/OVRCameraRig.prefab)を検索し.OVRCameraRigOVRSceneManagerをAssetsにドラッグ&ドロップする.

Search:In Packagesになっているかどうか確認すること

スクリーンショット 2024-04-08 16.54.06.png

Assetsフォルダを開くと以下のようになっている.OVRCameraRigOVRSceneManagerが追加されているか確認する.

スクリーンショット 2024-04-08 17.29.02.png

次に"Assets"フォルダ内のOVRCameraRigOVRSceneManagerをhierarchyビューのSampleSceneに追加して,MainCameraを削除する.必要に応じてOVRCameraRigの位置を調節する.OVRSceneManagerは変更不要である.

スクリーンショット 2024-04-08 17.36.30.png

hierarchyビューのOVRCameraRigを選択してinspectorビューでTarget DevicesQuest3にチェックする.
スクリーンショット 2024-04-08 18.06.26.png

inspectorビューでScene SupportとをRequiredにする.
スクリーンショット 2025-02-24 22.40.09.png

XR Plug-in Managementをinstallしておく.
スクリーンショット 2025-02-22 14.02.30.png

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が提供するクラウドサービスであり, リアルタイムマルチプレイヤーゲームの接続管理やサーバー機能をクラウド上で提供するプラットフォームである, 開発者は自前のサーバー環境を構築する手間を省き, グローバルに分散されたサーバー群によって安定した通信を実現することが可能である

https://www.photonengine.com/

Photon PUN2 における AppId の考え方
Photon Cloud に接続するための固有の識別子であり, 各プロジェクトに固有であるため, 正しい AppId を設定することで他のプロジェクトと混在せずに接続が行われる仕組みである.

Photon PUN2 における Room の考え方
Room は, リアルタイム通信を行う際の仮想的な空間であり, プレイヤーが同一の Room に参加することで状態の同期や通信が実現される, Room ごとに参加人数や設定が管理されており, 必要に応じて Room の作成や参加が自動的に行われる仕組みである.

Photonのアカウントを作成する.

スクリーンショット 2025-02-24 13.55.46.png

「Create a new app」を選択し,Photon アプリケーションを作成する.

スクリーンショット 2025-02-24 13.53.55.png

このようにアプリケーションが作成される.この上部にあるApp IDが今後必要になるのでどこかに控えておくこと

スクリーンショット 2025-02-24 14.45.15.png

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プロジェクトのセットアップ で済んでいるものとします.
WindowPackage Managerを選択.

スクリーンショット 2025-02-24 18.14.12.png

My AssetsPUN2 - FREEをインストールする.

スクリーンショット 2025-02-24 18.17.17.png

WindowPhoton Unity NetworkingPUN Wizardを選択
スクリーンショット 2025-02-24 18.19.39.png

Setup Projectを選択.

スクリーンショット 2025-02-24 18.21.06.png

先ほどメモしたApp IDを入力してSetup Projectを選択する.

スクリーンショット 2025-02-24 18.21.22.png

するとAssets/Photon/PhotonUnityNetworking/Resources/PhotonServerSettings.assetが作成される.

Assets/Photon/以下ファイルはPUN2 - FREE アセットをインストールした時点で作成済みである

PhotonServerSettings.assetApp Id PUNが先ほど入力した’App IDと一致するかを確認する.

スクリーンショット 2025-02-24 18.25.00.png

実際にPhotonで通信するオブジェクトの設置

ここからは実際にPhotonで通信(複数クライアント間で位置の同期など)をするオブジェクトを設置する.

  • HierarchyビューでSphere(3Dオブジェクトならなんでもいいです)を設置する.

  • inspectorビューでAdd Componentを選択し,Photon ViewPhoton Transform Viewをアタッチする.

アニメーションも同期させたい場合はPhoton Animation Viewもアタッチする.

  • inspectorビューにあるsphereをドラッグ&ドロップでAssets/Resourcesディレクトリに設置する.

Photon PUN2の仕様上Assets/ResourcesディレクトリにオブジェクトがないとPhotonが認識しないみたいです.Assets/Resourcesディレクトリに必ずPrefab化をしましょう.

スクリーンショット 2025-02-24 18.29.31.png

(任意)通信失敗用のオブジェクトを設置する

inspectorビューにcube(3Dオブジェクトなら...(以下略))を設置.

このオブジェクトはPhotonの通信とは関係ないので何もAdd Componentしなくていいです.またPrefabの位置もAssets/Resoueces以下ディレクトリでなくてもいいです...

スクリーンショット 2025-02-24 18.36.32.png

通信用のGameManagerの作成

inspectorビューで空のGame Object(Create Empty)を作成する.
スクリーンショット 2025-02-24 18.38.48.png

任意のディレクトリに以下のC#スクリプトを設置する.

スクリプト名はPhotonGameManager.csにしています

Photon.Punのメソッドをオーバーライドしています.詳しいスクリプトの内容は別の記事で紹介しようと思います.

PhotonGameManager.cs
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でアタッチする

スクリーンショット 2025-02-24 18.41.34.png

inspectorビューでPhoton Objectに先ほど作成したSphereをアタッチ.
(任意)Photon Failure Objectに先ほど作成したCubeをアタッチ.

スクリーンショット 2025-02-24 18.42.46.png

ここまでをVR側のプロジェクトとMR側のプロジェクトで同じように設定すること.
これでPhotonの通信部の設定は完了です.

ビルドと実行

FileBuild Profilesを選択

スクリーンショット 2025-02-24 22.32.27.png

PlatfolmsAndroidにしてBuild And Runを選択してMetaQuest3で実行する.
スクリーンショット 2025-02-24 22.33.29.png

これでVR側とMR側の両方にSphereがあれば成功である.

エラーハンドリング

  • VR側とMR側の両方のAssets/ResourcesにPhotonで通信する同じオブジェクトがあることはないですか?

結構忘れがちです

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?