MRが楽しい

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

HoloLens2でホロモンアプリを作る その84(プレイヤーが伏せるとホロモンも伏せる)

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

今回はプレイヤーが伏せるとホロモンも伏せるようになるメモです。

プレイヤーが伏せた状態の判定

以下の記事で試したオブジェクトの地面からの高さを計測するスクリプトを利用します。
bluebirdofoz.hatenablog.com

プレイヤーの状態判定のスクリプトから高さを参照し、50cm以下の高さに頭があるときは伏せていると判定するようにしました。
・HeadObjectFeaturesSetter.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using System;

using UniRx;
using UniRx.Triggers;

using HoloMonApp.CommonSpace;
using HoloMonApp.DataFormatSpace;

namespace HoloMonApp.Player
{
    [RequireComponent(typeof(ObjectFeatures))]
    public class HeadObjectFeaturesSetter : MonoBehaviour
    {
        [SerializeField, Tooltip("顔の状態判定ロジックの参照")]
        private HeadGestureRecognizer p_HeadGestureRecognizer;

        [SerializeField, Tooltip("高さ計測ロジックの参照")]
        private HeadHeightChecker p_HeadHeightChecker;

        // オブジェクトの特徴の設定参照
        private ObjectFeatures p_ObjectFeatures;


        /// <summary>
        /// 起動処理
        /// </summary>
        void Start()
        {
            // オブジェクトの特徴の参照を取得する
            p_ObjectFeatures = this.gameObject.GetComponent<ObjectFeatures>();

            // 初期状態は通常状態
            SettingNormal();
        }

        private void LateUpdate()
        {
            // 現在ジェスチャーを行っているか
            switch (p_HeadGestureRecognizer.CurrentStatus)
            {
                case HeadGestureRecognizer.HeadGestureStatus.Nod:
                    SettingNod();
                    return;
                case HeadGestureRecognizer.HeadGestureStatus.Shake:
                    SettingShake();
                    return;
                case HeadGestureRecognizer.HeadGestureStatus.TiltLeft:
                    SettingTiltLeft();
                    return;
                case HeadGestureRecognizer.HeadGestureStatus.TiltRight:
                    SettingTiltRight();
                    return;
            }
            // ジェスチャーを行っていなければ高さで寝転び判定を行う
            if (p_HeadHeightChecker.CurrentHeight < 0.5f)
            {
                SettingLieDown();
                return;
            }

            // どの状態にも一致しない場合
            SettingNormal();
            return;
        }


        /// <summary>
        /// 状態を通常状態に設定する
        /// </summary>
        private void SettingNormal()
        {
            p_ObjectFeatures.ChangeStatusHead(ObjectStatusHead.Nothing);
        }

        /// <summary>
        /// 状態を頷き状態に設定する
        /// </summary>
        private void SettingNod()
        {
            p_ObjectFeatures.ChangeStatusHead(ObjectStatusHead.Head_Nod);
        }

        /// <summary>
        /// 状態を首振り状態に設定する
        /// </summary>
        private void SettingShake()
        {
            p_ObjectFeatures.ChangeStatusHead(ObjectStatusHead.Head_Shake);
        }

        /// <summary>
        /// 状態を首傾げ(左方向)状態に設定する
        /// </summary>
        private void SettingTiltLeft()
        {
            p_ObjectFeatures.ChangeStatusHead(ObjectStatusHead.Head_TiltLeft);
        }

        /// <summary>
        /// 状態を首傾げ(右方向)状態に設定する
        /// </summary>
        private void SettingTiltRight()
        {
            p_ObjectFeatures.ChangeStatusHead(ObjectStatusHead.Head_TiltRight);
        }

        /// <summary>
        /// 状態を伏せ状態に設定する
        /// </summary>
        private void SettingLieDown()
        {
            p_ObjectFeatures.ChangeStatusHead(ObjectStatusHead.Head_LieDown);
        }
    }
}

頭部追従オブジェクトにスクリプトを設定して高さによって頭部の状態判定を変化させます。
f:id:bluebirdofoz:20211225024642j:plain

ホロモンのアクションとして伏せモーションを作成してアニメーションコントローラに State を作成します。
後は待機ロジック中にプレイヤーの伏せ状態を検出したら、この State にアニメーションを遷移させるだけです。
f:id:bluebirdofoz:20211225024651j:plain

動作確認

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

以下の通り、プレイヤーの頭の位置が50cm以下になるとホロモンも伏せの体勢になってくれるようになりました。
f:id:bluebirdofoz:20211225024707j:plain