MRが楽しい

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

HoloLens2でホロモンアプリを作る その66(ホロモンの睡眠時間(TimeSpan型)をInspectorビューから設定する)

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

今回はホロモンの睡眠時間(TimeSpan型)をInspectorビューから設定するメモです。

TimeSpan型をInspectorから設定する

ホロモンの睡眠時間はTimeSpan 型で取り扱っているため、そのままで Inspector 上に表示できません。
今回は文字列で設定した睡眠時間を TryParse() 関数で読み取る形で実装しました。
docs.microsoft.com

以下のように Inspector ビューから文字列で睡眠の開始時間と終了時間を設定します。
f:id:bluebirdofoz:20211031233959j:plain

実装コード

以下の通り、初回参照時のみ Inspector の文字列をパースして TimeSpan 型の設定を取得しています。
TimeSpan 型は構造体のため、初回判定を行うために null 許容値型を利用しています。
・HoloMonSleepSetting.cs

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

namespace HoloMonApp.ConditionSpace
{
    /// <summary>
    /// ホロモンの睡眠設定
    /// </summary>
    [Serializable]
    public class HoloMonSleepSetting
    {
        [SerializeField, Tooltip("睡眠開始時間設定テキスト(初期化時のみ有効)")]
        private string p_StartTimeText;

        /// <summary>
        /// 睡眠開始時間帯(private)
        /// </summary>
        private TimeSpan? p_StartTime;

        /// <summary>
        /// 睡眠開始時間帯
        /// </summary>
        public TimeSpan StartTime => GetStartTime();

        [SerializeField, Tooltip("睡眠終了時間設定テキスト(初期化時のみ有効)")]
        private string p_EndTimeText;

        /// <summary>
        /// 睡眠終了時間帯(private)
        /// </summary>
        private TimeSpan? p_EndTime;

        /// <summary>
        /// 睡眠終了時間帯
        /// </summary>
        public TimeSpan EndTime => GetEndTime();

        public HoloMonSleepSetting()
        {
            // 引数無しの場合時間帯は null のまま
            // Inspectorビューのテキストから設定読込を行う
        }

        public HoloMonSleepSetting(TimeSpan a_StartTime, TimeSpan a_EndTime)
        {
            p_StartTime = a_StartTime;
            p_EndTime = a_EndTime;
        }

        private TimeSpan GetStartTime()
        {
            if (p_StartTime == null)
            {
                TimeSpan parceTime = new TimeSpan();
                // 初期化時のみテキストから時刻指定の取得を試みる
                if (TimeSpan.TryParse(p_StartTimeText, out parceTime))
                {
                    p_StartTime = parceTime;
                    Debug.Log("SleepStartTimeSpan : " + p_StartTime.ToString());
                }
                else
                {
                    p_EndTime = new TimeSpan();
                    Debug.LogError("Parse Error : SleepStartTimeText");
                }
            }
            return p_StartTime ?? new TimeSpan();
        }

        private TimeSpan GetEndTime()
        {
            if (p_EndTime == null)
            {
                TimeSpan parceTime = new TimeSpan();
                // 初期化時のみテキストから時刻指定の取得を試みる
                if (TimeSpan.TryParse(p_EndTimeText, out parceTime))
                {
                    p_EndTime = parceTime;
                    Debug.Log("SleepEndTimeSpan : " + p_EndTime.ToString());
                }
                else
                {
                    p_EndTime = new TimeSpan();
                    Debug.LogError("Parse Error : SleepEndTimeText");
                }
            }
            return p_EndTime ?? new TimeSpan();
        }
    }
}

f:id:bluebirdofoz:20211031234012j:plain

動作確認

シーンを再生して動作を確認します。
デバッグログから Inspector で設定した睡眠時間が読み込まれていることが確認できます。
f:id:bluebirdofoz:20211031234021j:plain