MRが楽しい

MRやVRについて学習したことを書き残す

HoloLens2でホロモンアプリを作る その87(ホロモンが名前を言われたアイテムを取りに行く)

本日はアプリ作成枠です。
HoloLens2でホロモンアプリを作る進捗を書き留めていきます。
f:id:bluebirdofoz:20211230230922j:plain

今回はホロモンが名前を言われたアイテムを取りに行くメモです。

操作UIのアイテム名と音声認識の対応

操作UIで表示されるアイテム名全てに、対応する音声認識を設定しました。
f:id:bluebirdofoz:20211230230934j:plain

音声認識を行う言葉は MRTK のプロファイルの[Input]タブから[Speech]パネルを開いて登録します。
f:id:bluebirdofoz:20211230230948j:plain

以下の通り、操作UIで利用されている文言を一通り登録しました。
f:id:bluebirdofoz:20211230231001j:plain

アイテムを捜索して持ってくるロジックは以下のボール遊びのロジックを流用します。
bluebirdofoz.hatenablog.com

実装コード

以下のようにアイテム種別を指定して取ってくる行動を行うロジックを追加しました。
音声認識で認識したアイテムの種別を指定して本ロジックを実行します。
・HoloMonPorposeController.cs

// ...略...
        /// <summary>
        /// アイテムを持ってくるアクションの開始
        /// </summary>
        private async UniTask<bool> StartBringItemAsync(PurposeBringItemData a_Data)
        {
            // アクション名の定義
            HoloMonPurposeType actionFunction = HoloMonPurposeType.BringItem;

            // この状態でプレイヤーオブジェクトが見えていれば記憶しておく
            GameObject playerVisionObject = p_ReferenceFieldOfVision
                .CheckCollectionByNearDistance(a_ObjectUnderstandType: ObjectUnderstandType.FriendFace)?.Object;

            // モード結果の変数を用意する
            ModeLogicResult modeLogicResult;

            if (playerVisionObject == null)
            {
                // プレイヤーを未発見だった場合

                // 見回しモードのアクション設定を指定する
                p_HoloMonAction = new HoloMonAction(actionFunction,
                    new HoloMonActionSettings(
                        new ModeLogicSetting(new ModeLogicLookAroundData(ObjectUnderstandType.FriendFace))
                        ));

                // 指定モードのアクションに切り替えて完了を待機する
                modeLogicResult = await p_HoloMonActionController.RunActionAsync(p_HoloMonAction.ActionSettings);

                // 結果に応じて次のイベントを発生させる
                if (modeLogicResult.FinishModeStatus != HoloMonActionModeStatus.Achievement)
                {
                    // ロジックを達成できなかった場合

                    // 処理を終了する
                    return true;
                }

                // 発見オブジェクトを取得する
                playerVisionObject = modeLogicResult.ModeLogicLookAroundReturn.FindedObject;
            }

            // 指定種別のオブジェクトが見えているか否か
            GameObject targetVisionObject = p_ReferenceFieldOfVision
                .CheckCollectionByNearDistance(a_ObjectUnderstandType: a_Data.BringUnderstandType)?.Object;

            while (targetVisionObject == null)
            {
                // ターゲットが見えていない場合

                // 見回しモードのアクション設定を指定する
                p_HoloMonAction = new HoloMonAction(actionFunction,
                    new HoloMonActionSettings(
                        new ModeLogicSetting(new ModeLogicLookAroundData(a_Data.BringUnderstandType))
                        ));

                // 指定モードのアクションに切り替えて完了を待機する
                modeLogicResult = await p_HoloMonActionController.RunActionAsync(p_HoloMonAction.ActionSettings);

                // 結果に応じて次のイベントを発生させる
                if (modeLogicResult.FinishModeStatus != HoloMonActionModeStatus.Achievement)
                {
                    // ロジックを達成できなかった場合
                    // 処理を終了する
                    return true;
                }

                // 発見オブジェクトを取得する
                targetVisionObject = modeLogicResult.ModeLogicLookAroundReturn.FindedObject;
            }


            // ターゲット追跡モードのアクション設定を指定する
            p_HoloMonAction = new HoloMonAction(actionFunction,
                new HoloMonActionSettings(
                    new ModeLogicSetting(new ModeLogicTrackingTargetData(
                        targetVisionObject,
                        new TrackingSetting(0.25f, 1.0f, 1.0f, TrackingTargetCheckPosition.ObjectOrigin),
                        new HoldItemSetting()))
                    ));

            // 指定モードのアクションに切り替えて完了を待機する
            modeLogicResult =
                await p_HoloMonActionController.RunActionAsync(p_HoloMonAction.ActionSettings);

            // 結果に応じて次のイベントを発生させる
            if (modeLogicResult.FinishModeStatus != HoloMonActionModeStatus.Achievement)
            {
                // ロジックを達成できなかった場合

                // 処理を終了する
                return true;
            }

            // ターゲット追跡モードのアクション設定を指定する
            // ターゲットを保持しつつ、プレイヤーに歩み寄る
            p_HoloMonAction = new HoloMonAction(actionFunction,
                new HoloMonActionSettings(
                    new ModeLogicSetting(new ModeLogicTrackingTargetData(
                        playerVisionObject,
                        new TrackingSetting(0.125f, 2.0f, 2.0f, TrackingTargetCheckPosition.FootPosition),
                        new HoldItemSetting(targetVisionObject)))
                    ));

            // 指定モードのアクションに切り替えて完了を待機する
            modeLogicResult = await p_HoloMonActionController.RunActionAsync(p_HoloMonAction.ActionSettings);

            return true;
        }
// ...略...

動作確認

シーンを再生して動作を確認します。
f:id:bluebirdofoz:20211230231025j:plain

「おにく」や「おもちゃ」のアイテムをバラまいたところにホロモンを待機させます。
f:id:bluebirdofoz:20211230231037j:plain

「おにく」とホロモンに話しかけると、最初に視界に入った「おにく」アイテムにホロモンが歩み寄ります。
f:id:bluebirdofoz:20211230231051j:plain

「おにく」を掴み、そのままプレイヤーの方に持ってきてくれました。
f:id:bluebirdofoz:20211230231103j:plain