HoloLens2用アプリに再ビルド不要なデバッグモードを追加する(プロトコルでの実装)
今回は小技です。
前回、プロトコルから設定することでHoloLens2用アプリケーションでも起動時のモードを切り替えることができることがわかりました。
xr-physics-work-etc.hatenablog.com
今回はこのプロトコルで設定できるURIスキームを用いて、通常起動では実行されないデバッグモードを用意してみます。
URIスキームを用いたアプリケーションランチャーを作る
前回の記事で、新しいHoloLens2のOSではブラウザからURIスキーマを用いたアプリケーションの起動が行えませんでした。
そのため、まずはURIスキームを用いてアプリケーションを起動できる簡単なHoloLens2アプリケーションを作成します。
今回はシンプルにMRTK導入後、InputFiledとボタンだけで構成しました。
次にURIからアプリケーションを起動するためのスクリプトを作成します。
- LaunchApp.cs
クリックで展開
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.WSA; using TMPro; public class LaunchApp : MonoBehaviour { /// <summary> /// 実行するURIスキーム /// </summary> private string uriScheme = ""; /// <summary> /// 入力対象のInput field /// </summary> [SerializeField] private TMP_InputField inputFiled; /// <summary> /// URIスキームを設定する関数 /// </summary> public void SetScheme() { uriScheme = inputFiled.text; } /// <summary> /// URIスキームを元に実行する /// </summary> public void LaunchApplication() { try { Debug.Log($"Launch {uriScheme}"); Launcher.LaunchUri(uriScheme, true); } catch (System.Exception e) { Debug.Log(e); } } }
作成したスクリプトをコンポーネントとしてアタッチし、コンポーネントにInputFieldを参照させます。
また、InputFiledにURIスキームの設定(SetScheme)を、ボタンにURIスキームを元としたアプリケーションの実行(LaunchApplication)を設定します。
これで、InputFieldに入力したURIからアプリケーションを起動できるようになりました。
プロトコルでデバッグモードを実装する
次に、デバッグモード仕込むアプリケーションを作成します。
今回はアプリ名をURISchemeTest
にしています。
このアプリケーションがアプリケーションランチャーから起動されるものです。
MRTKを導入後、以下のようなHierarchyでシーンを設定します。
デバッグモードでない場合にも何か表示させるために、Cubeも配置しています。
デバッグモード用に、デバッグモードである旨を示すテキストとして、Debug Mode(TextMeshPro)、デバッグログ表示のためLogger(TextMeshPro)を用意しています。
今回は、Logger(TextMeshPro)でのログ出力にホロモンさんの下記を使用しました。
次に、URIを解釈し、必要があればデバッグモードに遷移するためのスクリプトを作成します。
今回は?
区切りでDebug
の文字列がURI中にある場合はデバッグモードとして扱うようにしました。
- DebugControlManager.cs
クリックで展開
using UnityEngine; using Microsoft.MixedReality.Toolkit; public class DebugControlManager : MonoBehaviour { /// <summary> /// 自インスタンス /// </summary> private static DebugControlManager instance; /// <summary> /// デバッグモードでのみ表示するオブジェクト /// </summary> [SerializeField] private GameObject[] targetObjects; /// <summary> /// デバッグモードかどうか /// </summary> public bool isDebugMode = false; /// <summary> /// デバッグモードにする場合のコマンドキーワード /// </summary> private static string debugKeyword = "Debug"; void Awake() { // シングルトン化 if (instance == null) { // 未作成の場合作成 instance = this; DontDestroyOnLoad(this.gameObject); } else { // すでに作成されている場合削除 Destroy(this.gameObject); } } // Start is called before the first frame update void Start() { Debug.Log("Start Check URI Schema"); Debug.Log($"URI:{Application.absoluteURL}"); // カスタム URI スキームを使用してアプリケーションが起動されている場合、 // Application.absoluteURLに値が入る if (!string.IsNullOrEmpty(Application.absoluteURL)) { GetURIInfo(Application.absoluteURL); } SetDebugState(); } // Update is called once per frame void Update() { } /// <summary> /// URI情報取得処理 /// </summary> /// <param name="uri"></param> void GetURIInfo(string uri) { string[] command; try { command = uri.Split('?'); } catch (System.Exception e) { Debug.Log(e); return; } DecodeURICommand(command); } /// <summary> /// URIコマンド解釈処理 /// </summary> /// <param name="args"></param> void DecodeURICommand(string[] args) { isDebugMode = false; foreach (var arg in args) { if (arg == debugKeyword) { Debug.Log("Exists debug command"); isDebugMode = true; } } } /// <summary> /// デバッグ状態の設定処理 /// </summary> void SetDebugState() { foreach (GameObject targetObject in targetObjects) { // 対象オブジェクトの有効/無効化 targetObject.SetActive(isDebugMode); } // MRTKの診断の有効/無効化 MixedRealityToolkit.DiagnosticsSystem.ShowDiagnostics = isDebugMode; } }
作成したDebugControlManager
を適当なオブジェクトにアタッチして、デバッグモードでのみ表示したいオブジェクトを設定します。
次に、URIスキームを使用するために必要な、プロトコルの設定を行います。
PlayerSetting
→Player
→Publishing Settings
のProtocolにURIスキーマとして設定するためのキーワードを設定します。
今回はuri-scheme-test
を設定しました。
これでURIスキームを使用するための設定ができました。
UnityアプリケーションをUWP用にビルドしてできたVisual StudioのソリューションファイルからPackage.appxmanifest
を確認すると、プロトコルの設定が正しくされていることを確認できます。
動作確認
動作確認として3パターン試してみます。
1. いつもアプリケーションを実行する場合と同じようにURISchemeTestを実行する
こちらはメニューからのいつも通りの起動のため、結果のみ記載すると、
[結果]
- 赤いCubeのみ表示される。
- MRTK標準の診断は表示されない。
2. アプリケーションランチャーから起動する
今回設定したURIスキームをアプリケーションランチャーに設定して起動します。
特に設定値はないので、適当に入力します。
uri-scheme-test://hoge?hoge
[結果]
3. URIにデバッグオプションを加えてアプリケーションランチャーから起動する
次にURIにデバッグオプションを追加して実行します。
uri-scheme-test://hoge?hoge?Debug
[結果]
- URIスキームに対応するアプリケーション(今回の場合は
URISchemeTest
)が実行される - デバッグモードでのみ表示設定した
Debug Mode
の文字列とデバッグログが表示される - (スクリーンショットに映っていないが)MRTKの診断が表示される
これで、プロトコル(URIスキーム)を用いたデバッグモードを仕込むことができました。
再ビルドしなくても、通常起動と、デバッグモードをHoloLens2のみで切り替えることができます。
他にも、アプリケーションへの引数の渡し方として応用できるような気がします。