質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
ARCore

ARCoreは、グーグル社が提供しているAndroid向けのAR(拡張現実)フレームワークです。スマホ内蔵のカメラとIMUセンサー(慣性計測装置)を使って、モーショントラッキングや水平面の検出、光源の推測を行い、ARを実現します。

Photon Server

Photon Serverは、オンラインゲーム開発向けネットワークエンジン。リアルタイムマルチプレイ通信のプラットフォームであるPhotonの一つで、サーバにインストールして使うサーバアプリケーションです。全てカスタマイズが可能で権限管理もできます。

Oculus

Oculusは、 仮想現実のハードウェアなどを開発している米IT企業、およびそのVRデバイスのシリーズ。低価格で広い視野角やヘッドトラッキングが特徴のVRヘッドセット「Oculus Rift」を始め、さまざまなVRデバイスがリリースされています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1954閲覧

Unity Photon スマートフォンの画面が取られる

Bump_430

総合スコア1

ARCore

ARCoreは、グーグル社が提供しているAndroid向けのAR(拡張現実)フレームワークです。スマホ内蔵のカメラとIMUセンサー(慣性計測装置)を使って、モーショントラッキングや水平面の検出、光源の推測を行い、ARを実現します。

Photon Server

Photon Serverは、オンラインゲーム開発向けネットワークエンジン。リアルタイムマルチプレイ通信のプラットフォームであるPhotonの一つで、サーバにインストールして使うサーバアプリケーションです。全てカスタマイズが可能で権限管理もできます。

Oculus

Oculusは、 仮想現実のハードウェアなどを開発している米IT企業、およびそのVRデバイスのシリーズ。低価格で広い視野角やヘッドトラッキングが特徴のVRヘッドセット「Oculus Rift」を始め、さまざまなVRデバイスがリリースされています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/06/02 05:07

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

おそらくですが、Photonに接続した際に生成している GameObject 内にカメラが含まれていませんか?
もし含まれている場合、VR側がログインしたタイミングでそのPrefabが生成され、結果、そちらのカメラが有効化されている、という流れかなと。

これを防ぐためには、各Platform側で自分用のカメラを適宜生成し、Photonで生成するPrefabにはカメラを含めないようにする必要があります。

具体的な方法はちょっとここでは説明しきれないので割愛します。

投稿2021/06/02 08:11

edo_m18

総合スコア2283

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bump_430

2021/06/02 10:40 編集

非常に的確なアドバイスありがとうございます。 更に、詳細な情報を書かせていただきたいのですが、VR側のカメラとして、 Oculus IntegrationのOVRCameraRigというものを使用しています。 もし、これに対する知識をお持ちでしたら、OVRCameraRigのどのオブジェクトをprefabから除けばよいか教えていただけないでしょうか。
edo_m18

2021/06/02 10:35

そうですね、まさにOVRCameraRigを取り除き、VRで起動した場合にはそれを、AR側の場合はARCore用のカメラを生成する、という対処が必要になります。
Bump_430

2021/06/02 11:42

現在、自分は、 void CreateVRBody() { PhotonNetwork.Instantiate(vrBody.name, transform.position, transform.rotation); } の部分でVRモデルのプレハブを生成しているのですが(OVRCameraRig含む)、このプレハブからOVRを取り除いたものを生成し、あとからOVR単体で生成し、VRモデルの子にすればよろしいでしょうか。その場合、コードのどの部分でOVRを生成するのが正しいでしょうか。 {モデル生成、OVR生成、子にする}という流れをCreateVRBody()で行ったところ、最初と同じ結果になってしましました。
edo_m18

2021/06/02 16:06

そもそも、相手側のカメラは不要だと思います。なので、OVRCameraRigは生成しなければ大丈夫です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問