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

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

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

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

Photon Server

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

Oculus

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

解決済

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

Bump_430
Bump_430

総合スコア1

ARCore

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

Photon Server

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

Oculus

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

1回答

0評価

0クリップ

918閲覧

投稿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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

ARCore

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

Photon Server

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

Oculus

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。