MRが楽しい

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

HoloLens2でホロモンアプリを作る その36(見えないプレイヤーに呼ばれたときに周りを見渡して探す)

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

今回は見えないプレイヤーに呼ばれたときに周りを見渡して探すメモです。

見えないプレイヤーに呼ばれたときに周りを見渡して探す

前回記事でホロモンが周りを見渡すことで物を発見できるようにしました。
bluebirdofoz.hatenablog.com

今回はこのアクションを利用して、ホロモンがプレイヤーに呼ばれたときに周りを見渡してプレイヤーを発見するようにします。
視界に人のオブジェクトが含まれているかの判定は以下の記事で作成したスクリプトを利用します。
bluebirdofoz.hatenablog.com

プレイヤーに呼ばれた場合、視界スクリプトにプレイヤーが検出されているか確認し、プレイヤーが検出されていなければ周りを見渡すアクションを行うスクリプトを作成しました。
・HoloMonAICenter.cs

        public void RequestTurnLookPlayer()
        {
            // 目的を設定する
            p_HoloMonPurpose = new HoloMonPurpose(HoloMonPurposeType.TurnTo, HoloMonPurposeTarget.Friend);

            // 現在プレイヤーが見えているか否か
            string friendName = HoloMonFieldOfVisionSingleton.Instance.FindFriend();

            if(friendName != "")
            {
                // アクションのオプションを設定する
                GameObject targetObject = Camera.main.gameObject;
                HoloMonActionOption actionOption = new HoloMonActionOption(
                    HoloMonActionHead.LookAtTarget, targetObject, HoloMonActionTail.Nothing);

                // プレイヤーが見えていればプレイヤーの方を向く
                p_HoloMonActionController.ActTurnLookPlayer(targetObject, actionOption);
            }
            else
            {
                // アクションのオプションを設定する
                HoloMonActionOption actionOption = new HoloMonActionOption(
                    HoloMonActionHead.Nothing, null, HoloMonActionTail.Nothing);

                // プレイヤーが見えていなければ周囲を見回す
                p_HoloMonActionController.ActLookAround(actionOption);
            }
        }

f:id:bluebirdofoz:20210502234025j:plain

視界に人の特徴を持つオブジェクトが検出された場合、それを呼びかけた人と判断して再度振り向き処理を行います。
ホロモンの行動目的とアクションを参照することで、複数のアクションを組み合わせて目的を達成します。
・HoloMonAIVisionStudy.cs

        /// <summary>
        /// 視界内オブジェクト発見状態の変化時のアクションを実行する
        /// </summary>
        private void FieldOfVisionObject()
        {
            // 見てるもののオブジェクト情報を取得する
            HoloMonFieldOfVisionObject visionObject = HoloMonFieldOfVisionSingleton.
                Instance.IReadOnlyReactivePropertyHoloMonVision.Value;

            // 見てるものがあるか
            bool isVision = visionObject.Vision;

            // 現在のホロモンの行動目的を取得する
            HoloMonPurpose currentHolomonPurpose = p_HoloMonAI.GetCurrentPurpose();

            // 現在のホロモンのアクション種別を取得する
            HoloMonActionTag currentHolomonActionType = p_HoloMonAI.GetCurrentActionTag();

            switch (currentHolomonPurpose.PurposeType)
            {
                case HoloMonPurposeType.Nothing:
                case HoloMonPurposeType.LookAt:
                    // 目的無し、または、何らかの注視中、物探し中は反応する
                    if (isVision)
                    {
                        switch (visionObject.UnderstandType)
                        {
                            case ObjectUnderstandType.NewSpawn:
                                // 新発見オブジェクトが見えている場合はオブジェクトの方を見てオブジェクト種別をチェックする
                                p_HoloMonAI.RequestLookingNewSpawn(visionObject.GameObject);
                                break;
                            case ObjectUnderstandType.FriendFace:
                                // 友達オブジェクトが見えている場合はオブジェクトの方を見る
                                p_HoloMonAI.RequestLookingFriend(visionObject.GameObject);
                                break;
                            case ObjectUnderstandType.FriendRightHand:
                                break;
                            case ObjectUnderstandType.FriendLeftHand:
                                break;
                            case ObjectUnderstandType.Food:
                                break;
                            case ObjectUnderstandType.Shit:
                                break;
                            case ObjectUnderstandType.Attention:
                                // 注目オブジェクトが見えている場合はオブジェクトの方を見る
                                p_HoloMonAI.RequestLookingAttention(visionObject.GameObject);
                                break;
                            default:
                                // 注視したいオブジェクトが存在しない場合は待機アクションに戻る
                                p_HoloMonAI.RequestStandby();
                                break;
                        }
                    }
                    else
                    {
                        // 視界にオブジェクトが存在しない場合は待機アクションに戻る
                        p_HoloMonAI.RequestStandby();
                        break;
                    }
                    break;
                case HoloMonPurposeType.LookingFor:
                    break;
                case HoloMonPurposeType.TurnTo:
                    if (currentHolomonActionType == HoloMonActionTag.LookAround)
                    {
                        if (isVision)
                        {
                            switch (visionObject.UnderstandType)
                            {
                                case ObjectUnderstandType.NewSpawn:
                                    // 新発見オブジェクトが見えている場合はそのままオブジェクト種別をチェックする
                                    p_HoloMonAI.RequestCheckNewSpawn(visionObject.GameObject);
                                    break;
                                case ObjectUnderstandType.FriendFace:
                                    if (currentHolomonPurpose.PurposeTarget == HoloMonPurposeTarget.Friend)
                                    {
                                        // 友達オブジェクトを探していた場合はターン処理を再実行する
                                        p_HoloMonAI.RequestTurnLookPlayer();
                                    }
                                    break;
                                default:
                                    break;
                            }
                        }
                    }
                    break;
                case HoloMonPurposeType.TrackingFor:
                    break;
                case HoloMonPurposeType.StopWaiting:
                    break;
                case HoloMonPurposeType.Eating:
                    break;
                case HoloMonPurposeType.Playing:
                    break;
                case HoloMonPurposeType.Sleeping:
                    break;
                case HoloMonPurposeType.ShitPutout:
                    break;
                default:
                    break;
            }

f:id:bluebirdofoz:20210502234041j:plain

シーンを再生して動作を確認します。
ホロモンがこちらを発見しているときに「ホロモン」と声をかけてみます。
f:id:bluebirdofoz:20210502234056j:plain

このときはホロモンがそのままこちらを向きます。
f:id:bluebirdofoz:20210502234110j:plain

次にホロモンがこちらを見失っているときに「ホロモン」と声をかけてみます。
f:id:bluebirdofoz:20210502234124j:plain

ホロモンが顔を振って周りを見渡し、こちらを探します。
f:id:bluebirdofoz:20210502234139j:plain

こちらを視界に収めて発見したときに、こちらを向いてくれました。
f:id:bluebirdofoz:20210502234152j:plain