Swampdog part25 -表示切替1-
エラーの泥沼にハマったり、事業計画を書いていたりとで開発が一時ストップしていました。
内容的にはpart23の続きになります。
骨、心臓、肺のオブジェクトを表示・非表示出来るボタンを付けます。
- On/Offがわかる
- Air Tapを認識する
- オブジェクトの表示/非表示を操作する
MRDesignLabインポート
以下の記事を参考にMRDesignLabをダウンロード、HoloToolkitの時と同じようにカスタムパッケージを作成、自分のプロジェクトを開きなおしてインポートしました。
part24 -仕切り直し-で視線を取得するためにHoloToolkitからInputManagerを導入しました。
入力系統の制御をMRDesignLabに切り替える
MRDesignLabでも改めて入力を取得するマネージャーが用意されています。
それがHoloLens.prefabです。
「MRDesignLab -> HUX -> Prefabs -> Interface」に入っています。
おおむねInputManagerと同じ働きをするだろうと予想して、置換してみたところアプリの操作が重くなりました。中でなんかがうまくいっていない様子。
HoloLens.prefabのカーソルと自分で設定したカーソルが喧嘩している?
カメラもダブるからよくないんでしょうか?
すでに設置されていたHoloLensCamera、Cursor、InputManagerを削除します。
「HoloLens -> Focus Manager -> HoloLens Focuser」にGetObjectNameを当てます。
Labelに設定されているReplaceLabelを修正。
// cursorObj = GameObject.Find("Cursor"); cursorObj = GameObject.Find("HoloLens Focuser");
だいぶすっきりしました。
カーソルが変わってしまいましたが、機能を維持したままうまく切り替えられました。
(カーソルにライトが設定されているのかやたら光る)
カーソル周りの変更もprefabでできるみたいなのでいい塩梅のカーソルを設定したいですね。
いずれMRDesignLabもHTKもといMixedRealityToolkitに吸収されるとは思いますが。
Air Tap認識
ボタンを用意する前にAir Tapを認識しているか確認します。
多分先ほど設置したHoloLens.prefabが認識していると思われます。
ここら辺を参考に勉強します。
- D.YAMA Blog | MRDesignLabを使いジェスチャー入力を取り扱う
- D.YAMA Blog | 【MRDesignLab】ButtonHolographicを使おう
今回はMRDesignLabに切り替えたので余談ですが、HoloToolkitの場合の入力の扱い方はこちら。
加えて、DesignLabs_Unity_Examplesを開いたのち、シーン選択で「MRDL_ControlsExample -> Scenes -> InteractableObject_Examples」を開きます。
いつものようにビルドして実機で挙動を確認。
ReceiversというのがAir Tapを認識していることを確認しました。
Receiversに設定されているコンポーネント、「ButtonReceiverExample」を見てみます。
Interactiblesにジェスチャーをリッスンするオブジェクトが設定されています。
Text Object Stateに書き換える対象の3DTextPrefabが設定されています。
コードの中身はこんな感じ。
// // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See LICENSE in the project root for license information. // using HUX.Focus; using HUX.Interaction; using HUX.Receivers; using UnityEngine; namespace HUX { public class ButtonReceiverExample : InteractionReceiver { public GameObject TextObjectState; public TextMesh txt; void Start() { txt = TextObjectState.GetComponentInChildren<TextMesh>(); } protected override void OnTapped(GameObject obj, InteractionManager.InteractionEventArgs eventArgs) { txt.text = obj.name + " : OnTapped"; switch (obj.name) { case "ButtonMeshPrimitive": // Do something on ButtonMeshPrimitive:OnTapped break; case "ButtonCoffeeCup": // Do something on ButtonCoffeeCup:OnTapped break; (中略) } base.OnTapped(obj, eventArgs); } protected override void OnHoldStarted(GameObject obj, InteractionManager.InteractionEventArgs eventArgs) { txt.text = obj.name + " : OnHoldStarted"; base.OnHoldStarted(obj, eventArgs); } protected override void OnFocusEnter(GameObject obj, FocusArgs args) { txt.text = obj.name + " : OnFocusEnter"; base.OnFocusEnter(obj, args); } protected override void OnFocusExit(GameObject obj, FocusArgs args) { txt.text = obj.name + " : OnFocusExit"; base.OnFocusExit(obj, args); } } }
大体理解できますね。
Microsoftすごい。優れたコードは流し読みで理解できるって偉い人が言ってました。
というか、この書き方からして、Labelの書き換えもこのレシーバーに任せるべきだったんですかね。
リファクタリング案件としてメモしておきます。
自前のプロジェクトに切り替え実装していきます。
「Create Empty」で「Receivers」を作成。
3DTextPrefabを新しく作成。「TappedTissue」と名付けます。
ついでにラベル類をまとめます。
「Scripts」にSwitchButtonReceiverを作成。
中身はButtonReceiverExampleと同じ。
ReceiversにAdd Componentで追加。
Text Object Stateには書き換え対象であるTappedTissueを設定します。
Air Tapを受けるボタンを作成します。
「MRDesignLab -> HUX -> Prefabs -> Buttons -> SquareButton」を3つもってきます。
Buttonsにまとめて、BoneButton、HeartButton、LungButtonと名付けます。
それぞれ骨、肺、心臓の表示を担います。
よしなに配置。
ビルドしてチェック。
フォーカスは取れているけど、タップが取れていない。
とりあえず今日はここまで、次回はフォーカスが取れていないのを対処します。