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

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

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

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

Q&A

解決済

1回答

7481閲覧

UnityのXR Plugin Managementを利用したVRアプリでVRモードと通常モードを切り替えたい

yuraoka

総合スコア3

Unity

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

2グッド

1クリップ

投稿2020/08/26 06:29

編集2020/09/01 14:58

経緯

ビルトインのVRプラグインが非推奨になり、代わりにXR Plugin Managementが推奨されるようになりました。
BuiltinVR

そこで以下のリポジトリからXR Plugin Managementに対応したCardBoardプラグインを導入しました。
https://github.com/googlevr/cardboard-xr-plugin

Initialize XR on Startupの項目にチェックを入れてビルドしたところ、VRモードで起動することに成功しています。
XRPluginManagement

やりたいこと

アプリ内でVRモードと通常モードの切り替えを行いたいです。

今までのビルトインVRでは以下のコードでVRモードの切り替えを行っていました。

// VR有効化 XRSettings.LoadDeviceByName("cardboard"); XRSettings.enabled = true;
// VR無効化 XRSettings.LoadDeviceByName("");

しかしこのコードはXR Plugin Management版では動作しませんでした。
XRSettingsは未使用になったのかと思い実機でログを確認してみたところ、

XRSettings.enabled : true XRSettings.loadedDeviceName : Display

となっていました。

XR Plugin ManagementでInitialize XR on Startupの項目のチェックを外して起動すると、

XRSettings.enabled : false XRSettings.loadedDeviceName : ""

と値が変わったので、XRSettingsが使われなくなったわけではない? ように見えます。

まとめ

以上、XR Plugin Managementを利用したVRアプリでVRモードと通常モードを切り替えたい。という質問になります。
ヒントや予想だけでも頂けると幸いです。
よろしくお願い致します。

追記

モードの切り替えができたので方法を記しておきます。

// AssemblyDefinitionが分かれている場合はUnity.XR.Managementアセンブリを参照に加えるとusingできます。 using UnityEngine.XR.Management;

VR有効化

var manager = XRGeneralSettings.Instance.Manager; // 旧バージョンと違って画面の回転は自動で行わないので自前で行う必要があります。 // 画面の回転が完了する前にVRモードを始めてしまうと表示がおかしくなるので回転完了を待機しています。 Screen.orientation = ScreenOrientation.LandscapeLeft; while (Screen.orientation != ScreenOrientation.LandscapeLeft) { yield return null; } // manager.DeinitializeLoaderを呼んでから再度InitializeLoaderを呼ぶとAndroidでクラッシュします。 // そのため一度InitializeLoaderを呼び出したらDeinitializeLoaderもInitializeLoaderも呼ばないようにします。 if (!manager.isInitializationComplete) { yield return manager.InitializeLoader(); } manager.StartSubsystems();

VR無効化

// VRモードを終了する際は特に特殊な設定は必要ありません。 // VR開始時に書きましたがDeinitializeLoaderを呼ばないようにだけ注意します。 var manager = XRGeneralSettings.Instance.Manager; Screen.orientation = ScreenOrientation.Portrait; manager.StopSubsystems();
kleus_balut, potetiniku👍を押しています

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

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

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

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

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

tsuki01

2020/08/26 14:57

実際に試した訳ではないので情報共有だけになります。 既に確認済みでしたらスルーしてください。 以下参考サイトなどではコルーチンから切り替えの処理を呼び出しています。呼び出し方を参考サイトの様に変更したら何か変わったりしませんでしょうか。。 ※コルーチンにする理由などを私は把握しておらず、申し訳ないです。 https://sear-azazel.github.io/2019/12/20/unity-develop-xr/ https://docs.unity3d.com/ja/current/ScriptReference/XR.XRSettings.LoadDeviceByName.html
yuraoka

2020/08/26 17:26

情報共有ありがとうございます。 上記2つの記事を参考にコルーチン版で実装してみました。 しかし挙動としてはコルーチンではないコードと同一(VRモードの切り替えできず)でした。 上記の記事でコルーチンにしている理由としてはおそらく、 XRSettings.LoadDeviceByName が正常に動作した場合反映に1フレームかかるので yield return null; で1フレーム待ってから XRSettings.enabled を操作しているのではないかと思います。 こうした未確認な情報でも頂けると非常に助かります。 ありがとうございます!
guest

回答1

0

ベストアンサー

公式フォーラムに同じ問題に遭遇して解決したスレッドがありました。
https://forum.unity.com/threads/toggle-between-2d-and-google-cardboard.902378/

ここではXRSettingsは使われていないのでログは設定を表示してるだけで使われていないと思われます。

投稿2020/08/26 18:27

shiena

総合スコア1827

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

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

yuraoka

2020/08/27 02:07

これは非常に参考になりそうな内容です。 確認してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問