前提・実現したいこと
UnityでVRモデルをスマートフォン(Android)を使いARで表示するものを作っています。
ネットワークはPUN2を使用しており、ARはARcoreを使用しています。
VR:OculusQuest2
(https://assetstore.unity.com/packages/tools/integration/vr-ar-crossplatform-multiplayer-pun-2-template-176522)
VR + AR Crossplatform Multiplayer Pun 2 Templateを参考に作っており、これはビルドする前に、scriptを使いARModeかVRModeを選択しビルドを行います。
発生している問題・エラーメッセージ
問題は、スマートフォンでルームに接続し、ARカメラを起動するところまでは成功しているのですが、
・VR側としてPCにOculusLinkでOculusQuest2を使い再生(テスト)
・スマートフォンと同じ部屋につなぐ
という上記の二つのことを行うと、スマートフォン側の画面が切り替わってVR側と同じ画面になってしまいます。(画面がVR視点に取られる)
VR側をPUN2から切断するとスマートフォン側もARカメラに戻ります。
どうすれば、スマートフォン側の画面がPC側・VR側の影響を受けずにARカメラを表示の維持をできるでしょうか。
該当のソースコード
部屋の接続
C# Lobby.cs
using UnityEngine;
using Photon.Realtime;
using Photon.Pun;
using UnityEngine.SceneManagement;
using System.Collections;
//このスクリプトはphoton2サーバーへの接続と部屋の作成を行うものである。もし作成されば、自動で入室する。
public class XRcastLobby : MonoBehaviourPunCallbacks
{
//マスターへの接続、部屋への接続のフラグ 最初はfalse
bool triesToConnectToMaster = false;
bool triesToConnectToRoom = false;
// フレームごとに更新されるもの private void Update() { //もしphotonに接続しておらず、マスターへの接続を試みておらず、部屋への接続を試みていなければ if (!PhotonNetwork.IsConnected && !triesToConnectToMaster && !triesToConnectToRoom) { //Masterへ接続する ConnectToMaster(); } //photonへ接続していれば、コルーチンを実行。StartCoroutineの引数には、実行したいコルーチンの関数名を指定する。 if (PhotonNetwork.IsConnected && !triesToConnectToMaster && !triesToConnectToRoom) { StartCoroutine(WaitFrameAndConnect()); } } //マスターへ接続する public void ConnectToMaster() { //オフラインモードをオフに PhotonNetwork.OfflineMode = false; //true would "fake" an online connection //ニックネームの入力 PhotonNetwork.NickName = "PlayerName"; //MasterClient以外のClientがシーンの切り替えを、MasterClientのシーンの切り替えに同期して行うことができます。 PhotonNetwork.AutomaticallySyncScene = true; //To call PhotonNetwork.LoadLevel() //同じバージョンのプレイヤーだけがともに接続可能 PhotonNetwork.GameVersion = "v1"; //only people with the same game version can play together //フラグon triesToConnectToMaster = true; //PhotonNetwork.ConnectToMaster(ip, port, appid); //manual connection (手動で接続を指定する場合) //とりあえずConnectUsingSettings()を呼べばいい PhotonNetwork.ConnectUsingSettings(); //automatic connection based on the config file } //切断する public override void OnDisconnected(DisconnectCause cause) { base.OnDisconnected(cause); triesToConnectToMaster = false; triesToConnectToRoom = false; //切断理由をデバッグする Debug.Log(cause); } //ConnectToMasterをもとに接続(本体) public override void OnConnectedToMaster() { base.OnConnectedToMaster(); triesToConnectToMaster = false; Debug.Log("Connected to master!"); } //接続中 IEnumerator WaitFrameAndConnect() { triesToConnectToRoom = true; yield return new WaitForEndOfFrame(); Debug.Log("Connecting"); ConnectToRoom(); } //ランダムな部屋に接続 public void ConnectToRoom() { if (!PhotonNetwork.IsConnected) { return; } triesToConnectToRoom = true; PhotonNetwork.JoinRandomRoom(); // Join a random room - Callback OnJoinRandomRoomFailed } //部屋に接続する(本体) public override void OnJoinedRoom() { //Go to next scene after joining the room base.OnJoinedRoom(); //クライアントかどうか、何人目か、部屋の名前、接続地域 Debug.Log("Master: " + PhotonNetwork.IsMasterClient + " | Players In Room: " + PhotonNetwork.CurrentRoom.PlayerCount + " | RoomName: " + PhotonNetwork.CurrentRoom.Name + " Region: " + PhotonNetwork.CloudRegion); //シーンRoomを読み込み Debug.Log("Roomを読み込みます"); SceneManager.LoadScene("XRCastRoom"); } public override void OnJoinRandomFailed(short returnCode, string message) { base.OnJoinRandomFailed(returnCode, message); //no room available //create a room (null as a name means "does not matter") PhotonNetwork.CreateRoom(null, new RoomOptions { MaxPlayers = 5 }); }
}
AR・VRの切り替えと生成
C# Platform.cs
using UnityEngine;
using Photon.Realtime;
using Photon.Pun;
using UnityEngine.SceneManagement;
using System.Collections;
//ARとVRの二つのモードを処理する
public class XRCastPlatform : MonoBehaviourPunCallbacks
{
[SerializeField] GameObject arSession;
[SerializeField] GameObject cameraMesh;
[SerializeField] GameObject arRig;
public Transform arCamera;
[SerializeField] GameObject vrBody;
//ビルド前にplatformを選択する enum Mode { VR, AR }; [Tooltip("Choose the mode before building, also you should change the XR Plugin Manager settings")] [SerializeField] Mode mode; public static XRCastPlatform instance; void Awake() { //もし接続できなければロビーに戻る //If not connected go to lobby to connect if (!PhotonNetwork.IsConnected) { SceneManager.LoadScene(0); } instance = this; } // Start is called before the first frame update void Start() { if (mode == Mode.VR) { CreateVRBody(); } else if (mode == Mode.AR) { Debug.Log("AR側を生成します"); arSession.SetActive(true); arRig.SetActive(true); CreateARBody(); } } void CreateVRBody() { PhotonNetwork.Instantiate(vrBody.name, transform.position, transform.rotation); } void CreateARBody() { PhotonNetwork.Instantiate(cameraMesh.name, transform.position, transform.rotation); } //サーバーから切断されたらロビーに戻る //If disconnected from server, return to lobby to reconnect. public override void OnDisconnected(DisconnectCause cause) { base.OnDisconnected(cause); GoToScene(0); } //scene読み込みルーチンを実行 void GoToScene(int n) { StartCoroutine(LoadScene(n)); } //シーン読み込み IEnumerator LoadScene(int n) { yield return new WaitForSeconds(0.5f); AsyncOperation async = SceneManager.LoadSceneAsync(n); async.allowSceneActivation = false; yield return new WaitForSeconds(1); async.allowSceneActivation = true; if (n == 0) //if going back to menu destroy instance { Destroy(gameObject); } } //アプリが終了したら、シーンの読み込みをやめる //So we stop loading scenes if we quit app private void OnApplicationQuit() { StopAllCoroutines(); }
}
試したこと
補足情報(FW/ツールのバージョンなど)
Unity 2020.3.10f1
OculusQuest2
Android(SO-01K)
ARcore
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/02 10:40 編集
2021/06/02 10:35
2021/06/02 11:42
2021/06/02 16:06