MRが楽しい

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

HoloLens2でホロモンアプリを作る その64(ホロモンが何かを見つけた時に瞳孔が開く)

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

ホロモンが何かを見つけた時に瞳孔が開くようにしたメモです。

ホロモンが何かを見つけた時に瞳孔が開く

以下の記事で作成したホロモンの瞳孔を操作する仕組みを利用します。
bluebirdofoz.hatenablog.com
bluebirdofoz.hatenablog.com

今回は以下のロジックに瞳孔を開くコードを追加することで、何かを見つけた時にホロモンの瞳孔が開くようにしました。
bluebirdofoz.hatenablog.com

実装スクリプト

以下の頭部の視線変更を行うスクリプトに前回スクリプトの参照を追加しました。
何か発見すると同時に瞳孔を開く関数を呼び出しています。
・HoloMonHeadLogicLookAtTarget.cs

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

using HoloMonApp.CommonSpace;
using HoloMonApp.ActionSpace;

namespace HoloMonApp.HeadLogicSpace
{
    public class HoloMonHeadLogicLookAtTarget : MonoBehaviour, HoloMonHeadLogicInterface
    {
        /// <summary>
        /// 視線ロジック共通情報
        /// </summary>
        [SerializeField, Tooltip("視線ロジック共通情報")]
        private HoloMonHeadLogicCommon p_HeadLogicCommon = new HoloMonHeadLogicCommon();

        /// <summary>
        /// 現在のモードを取得する
        /// </summary>
        /// <returns></returns>
        public HoloMonActionHeadStatus GetHoloMonHeadStatus() => p_HeadLogicCommon.HeadLogicStatus;

        /// <summary>
        /// EveryValueChanged オブザーバ参照変数を取得する
        /// </summary>
        /// <returns></returns>
        public IObservable<HoloMonActionHeadStatus> GetHoloMonHeadStatusEveryValueChanged()
            => p_HeadLogicCommon.IObservableHeadLogicStatusEveryValueChanged;

        /// <summary>
        /// モード設定を有効化する
        /// </summary>
        public bool EnableHead()
        {
            // 開始処理を行う
            EnableSetting();

            // 開始状態を設定する
            p_HeadLogicCommon.SetHeadStatus(HoloMonActionHeadStatus.Runtime);

            return true;
        }

        /// <summary>
        /// モード設定を無効化する
        /// </summary>
        public bool DisableHead(HoloMonActionHeadStatus a_DisableStatus)
        {
            // 停止処理を行う
            DisableSetting();

            // 停止状態を設定する
            p_HeadLogicCommon.SetHeadStatus(a_DisableStatus);

            return true;
        }

        /// <summary>
        /// アクション設定を反映する
        /// </summary>
        /// <returns></returns>
        public bool ApplySetting(HeadLogicSetting a_HeadLogicSetting)
        {
            // 設定の反映を行う
            ApplyData(a_HeadLogicSetting);

            return true;
        }


        /// <summary>
        /// 設定アクションデータ
        /// </summary>
        [SerializeField, Tooltip("設定アクションデータ")]
        private HeadLogicLookAtTargetData p_Data;

        /// <summary>
        /// ホロモン頭部視点の制御コンポーネント
        /// </summary>
        [SerializeField, Tooltip("ホロモン頭部視点の制御コンポーネント")]
        private HeadLookControllerSmooth p_HeadLookController;

        /// <summary>
        /// ホロモン瞳孔部の制御コンポーネント
        /// </summary>
        [SerializeField, Tooltip("ホロモン瞳孔部の制御コンポーネント")]
        private PupilAnimationController p_PupilAnimationController;

        /// <summary>
        /// HeadLookControllerの各ボーンの最大角デフォルト設定
        /// </summary>
        [SerializeField, Tooltip("HeadLookControllerの各ボーンの最大角デフォルト設定")]
        private float p_DefaultMaxBendingAngles;

        /// <summary>
        /// HeadLookControllerのアニメーションオーバーライドのデフォルト値
        /// </summary>
        [SerializeField, Tooltip("HeadLookControllerのアニメーションオーバーライドのデフォルト値")]
        private bool p_DefaultOverrideAnimation;



        /// <summary>
        /// 定期処理(Late)
        /// </summary>
        void LateUpdate()
        {
            if (p_HeadLogicCommon.HeadLogicStatus == HoloMonActionHeadStatus.Runtime)
            {
                // プレイヤーの頭部位置を毎フレーム更新する
                p_HeadLookController.target = p_Data.TargetObject.transform.position;
            }
        }


        /// <summary>
        /// 視線モードの設定を有効化する
        /// </summary>
        private bool EnableSetting()
        {
            // 視線の追従を有効化する
            ChangeMaxBendingAngle(true);

            // 瞳孔の拡大アクションを実行する
            ChangePupilExpansion();

            return true;
        }

        /// <summary>
        /// 視線モードの設定を無効化する
        /// </summary>
        private bool DisableSetting()
        {
            // 視線の追従を無効化する
            ChangeMaxBendingAngle(false);

            return true;
        }

        /// <summary>
        /// 設定アクションデータを反映する
        /// </summary>
        private bool ApplyData(HeadLogicSetting a_HeadLogicSetting)
        {
            // 設定アクションデータをキャストして取得する
            p_Data = a_HeadLogicSetting.HeadLogicLookAtTargetData;

            return true;
        }

        /// <summary>
        /// 有効無効に合わせてHeadLookControllerの最大角を変更する
        /// </summary>
        /// <param name="onoff"></param>
        private void ChangeMaxBendingAngle(bool onoff)
        {
            // 有効無効に合わせてHeadLookControllerの最大角を変更する
            int segmentnum = p_HeadLookController.segments.Length;
            if (segmentnum > 0)
            {
                for (int loop = 0; loop < segmentnum; loop++)
                {
                    float setValue = 0;
                    if (onoff)
                    {
                        setValue = p_DefaultMaxBendingAngles;
                    }
                    p_HeadLookController.segments[loop].maxBendingAngle = setValue;
                }
            }
            // 有効無効に合わせてOverrideAnimationの設定を変更する
            p_HeadLookController.overrideAnimation = onoff ? p_DefaultOverrideAnimation : false;
        }

        /// <summary>
        /// 瞳孔の拡大アクションを実行する
        /// </summary>
        private void ChangePupilExpansion()
        {
            // 瞳孔の拡大アクションを実行する
            p_PupilAnimationController.ExpansionAction();
        }
    }
}

f:id:bluebirdofoz:20211016234953j:plain

動作確認

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

以下のように新しいオブジェクトを発見したときにホロモンの瞳孔が少し大きくなります。
細かいですが、ホロモンが対象に興味を持ったことが何となく感じ取れます。
f:id:bluebirdofoz:20211016235013j:plain