MRが楽しい

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

HoloLens2でホロモンアプリを作る その23(Inspectorから時刻を打ち込んでデバッグを行う)

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

今回はInspectorから時刻を打ち込んでデバッグを行うメモです。

Inspectorから時刻を打ち込む

前回、時間経過でホロモンがお腹を空かせる実装を行いました。
bluebirdofoz.hatenablog.com

エディター上で様々なケースの動作確認を行おうとしましたが、DateTime 型はシリアライズできないため、Inspectorビューに表示できません
そこで以下の記事を参考に、DateTime 型を文字列で設定できるテスト用スクリプトを作成しました。
https://tempura-kingdom.jp/serializabledatetime/

以下が試しに作成したテスト用スクリプトです。
Inspector 上のボタンをクリックすると、入力した時刻情報で経過時間を算出する試験が実行されます。
・TestConditionLife.cs

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

namespace HMProject.HoloMonCondition
{
    [RequireComponent(typeof(HoloMonConditionLifeSingleton))]
    public class TestConditionLife : MonoBehaviour
    {
        const string p_TimeFormat = "yyyy-MM-dd HH:mm:ss";

        [SerializeField, Tooltip("参照テストクラス")]
        private HoloMonConditionLifeSingleton p_Target;

        [SerializeField, Tooltip("始点時刻")]
        private string p_StartTimeText;

        private DateTime p_StartTime;

        [SerializeField, Tooltip("終点時刻")]
        private string p_EndTimeText;

        private DateTime p_EndTime;


        /// <summary>
        /// 時刻計算処理を実行する
        /// </summary>
        public void ExecuteActivityElapsedTime()
        {
            int dayMinute = 0;

            // テキストの時刻を DateTime 型にパースする
            if (!DateTime.TryParse(p_StartTimeText, out p_StartTime))
            {
                Debug.Log("Parse Error : StartTime");
                p_StartTime = new DateTime();
            }
            // テキストの時刻を DateTime 型にパースする
            if (!DateTime.TryParse(p_EndTimeText, out p_EndTime))
            {
                Debug.Log("Parse Error : EndTime");
                p_EndTime = new DateTime();
            }
            dayMinute = p_Target.ActivityElapsedMinutes(p_StartTime, p_EndTime);

            Debug.Log("ExecuteActivityElapsedTime : " + dayMinute);
        }

        /// <summary>
        /// 開始処理
        /// </summary>
        void Start()
        {
            // デフォルトの時刻を設定する
            p_StartTime = DateTime.Now;
            p_EndTime = DateTime.Now.AddMinutes(30.0f);

            // 時刻をテキストでInspectorに表示する
            p_StartTimeText = p_StartTime.ToString(p_TimeFormat);
            p_EndTimeText = p_EndTime.ToString(p_TimeFormat);
        }
    }
}

・TestConditionLifeEditor.cs

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

using UnityEditor;

namespace HMProject.HoloMonCondition
{
# if UNITY_EDITOR
    // 拡張するクラスを指定する
    [CustomEditor(typeof(TestConditionLife))]
    // 継承クラスは Editor を設定する
    public class TestConditionLifeEditor : Editor
    {
        // GUIの表示関数をオーバーライドする
        public override void OnInspectorGUI()
        {
            // 元のインスペクター部分を表示
            base.OnInspectorGUI();

            // targetを変換して対象スクリプトの参照を取得する
            TestConditionLife testIns = target as TestConditionLife;

            // public関数を実行するボタンの作成
            if (GUILayout.Button("ExecuteActivityElapsedTimeの実行"))
            {
                testIns.ExecuteActivityElapsedTime();
            }
        }
    }
# endif
}

作成したテスト用スクリプトをオブジェクトに追加します。
f:id:bluebirdofoz:20210329075856j:plain

シーンを再生して動作を確認します。
Inspector にテキストを入力してボタンをクリックすると、入力した任意の時刻情報で動作を試験することができました。
f:id:bluebirdofoz:20210329075906j:plain