MRが楽しい

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

HoloLens2でホロモンアプリを作る その78(プレイヤーの目の前にホロモンやアイテムをリスポーンする)

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

今回はプレイヤーの目の前にホロモンやアイテムをリスポーンするメモです。

リスポーン位置の設定

ホロモンやアイテムをリスポーンする位置をゲームオブジェクトを使って設定します。
プレイヤーの頭部オブジェクトの子オブジェクトにオブジェクトを配置して、常にプレイヤーの目の前にオブジェクトを追従するようにしました。
f:id:bluebirdofoz:20211201235103j:plain

また、ホロモンは成長して相手もそれに合わせて大きくなるのでリスポーン位置もホロモンの大きさに合わせて調整する必要があります。
以下のスクリプトをオブジェクトに設定して自動で調整するようにしました。
・ScaleCollaborationObject.cs

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

using UniRx;
using HoloMonApp.ConditionSpace;

namespace HoloMonApp.UtilitiesSpace
{
    public class ScaleCollaborationObject : MonoBehaviour
    {
        [Serializable]
        private enum CollaborationElement
        {
            /// <summary>
            /// スケールのみ連動
            /// </summary>
            ScaleOnly = 0,
            /// <summary>
            /// ポジションのみ連動
            /// </summary>
            PositionOnly = 1,
            /// <summary>
            /// スケールとポジションが連動
            /// </summary>
            ScaleAndPosition = 2,
        }

        [SerializeField, Tooltip("スケールと連動する要素の指定")]
        private CollaborationElement p_CollaborationElement;

        [SerializeField, Tooltip("デフォルトのポジション")]
        private Vector3 p_DefaultPosition;

        [SerializeField, Tooltip("デフォルトのスケール")]
        private Vector3 p_DefaultScale;

        [SerializeField, Tooltip("現在のスケール変化比率")]
        private float p_ScaleRatio;

        // Start is called before the first frame update
        void Start()
        {
            // デフォルトローカルポジションを保持する
            p_DefaultPosition = this.transform.localPosition;

            // デフォルトスケールを保持する
            p_DefaultScale = this.transform.localScale;

            // デフォルトの変化比率は 1 とする
            p_ScaleRatio = 1.0f;

            // 身長設定変更時の処理を設定する
            HoloMonConditionBodySingleton.Instance.IReadOnlyReactivePropertyHoloMonBodyStatus
                .ObserveOnMainThread()
                .Subscribe(status =>
                {
                // 現在のサイズの変化比率を取得する
                float currentScaleRatio = HoloMonConditionBodySingleton.Instance.GetHeightRatio();
                // サイズの変化比率が異なれば設定を行う
                if (p_ScaleRatio != currentScaleRatio)
                    {
                        ApplyTransformCondition(currentScaleRatio);
                    }
                })
                .AddTo(this);
        }

        /// <summary>
        /// 現在のホロモンの身長に合わせてトランスフォームを反映する
        /// </summary>
        /// <param name="a_ScaleRatio"></param>
        private void ApplyTransformCondition(float a_ScaleRatio)
        {
            // 設定中のサイズ比率を記録する
            p_ScaleRatio = a_ScaleRatio;

            switch (p_CollaborationElement)
            {
                case CollaborationElement.ScaleOnly:
                    // 比率に合わせてスケールを変化させる
                    this.transform.localScale = p_DefaultScale * p_ScaleRatio;
                    break;
                case CollaborationElement.PositionOnly:
                    // 比率に合わせてポジションを変化させる
                    this.transform.localPosition = p_DefaultPosition * p_ScaleRatio;
                    break;
                case CollaborationElement.ScaleAndPosition:
                    // 比率に合わせてポジションを変化させる
                    this.transform.localPosition = p_DefaultPosition * p_ScaleRatio;
                    // 比率に合わせてスケールを変化させる
                    this.transform.localScale = p_DefaultScale * p_ScaleRatio;
                    break;
                default:
                    break;
            }
        }
    }
}

以下の通り、スクリプトコンポーネントとして設定して大きさによる相対位置を維持するようにしています。
f:id:bluebirdofoz:20211201235115j:plain

リスポーン位置を指定する

ホロモンやアイテムの位置をリセットするイベントに作成したオブジェクトをリスポーン位置として引き渡します。
f:id:bluebirdofoz:20211201235124j:plain

一例として呼び出している食べ物のリスポーン用スクリプトは以下のような実装です。

動作確認

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

ハンドメニューを出して「おにく」ボタンを押すと常にプレイヤーの目の前にオブジェクトがリスポーンされます。
f:id:bluebirdofoz:20211201235150j:plain

ホロモンが成長してアイテムが大きくなった場合でも、相対的な距離を維持してオブジェクトがスポーンされます。
f:id:bluebirdofoz:20211201235159j:plain