MRが楽しい

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

HoloLens2でホロモンアプリを作る その113(ヘルプウィンドウを共通化する)

本日はアプリ作成枠です。
HoloLens2でホロモンアプリを作る進捗を書き留めていきます。
ヘルプウィンドウを共通化する修正を行いました。

ホロモンアプリで表示されるヘルプウィンドウ

ホロモンアプリではオブジェクトごとにそのキャラクターやアイテムを説明するヘルプウィンドウが表示されます。
これまでは実装の簡略化のため、オブジェクトごとに一緒にウィンドウを定義していましたが、ヘルプウィンドウを共通化するため別にまとめました。

実装コード

以下のようなスクリプタブルオブジェクトを定義し、ゲーム内に表示されるオブジェクトとそのヘルプウィンドウの表示内容をプロファイルとして保持させることにしました。
・HelpWindowProfileList.cs

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

namespace HoloMonApp.Content.SupportItem.Objects.HelpWindow
{
    [UnityEngine.CreateAssetMenu(fileName = "HelpWindowProfileList", menuName = "Create HelpWindowProfileList", order = 0)]
    public class HelpWindowProfileList : UnityEngine.ScriptableObject
    {
        [SerializeField]
        private List<HelpWindowProfile> helpWindowProfile;

        public HelpWindowProfile GetProfileByType(string type) => 
            helpWindowProfile.FirstOrDefault(profile => profile.Type == type) ??
                new HelpWindowProfile();
    }

    [Serializable]
    public class HelpWindowProfile
    {
        [SerializeField]
        private string type;

        [SerializeField]
        private string title;

        [SerializeField, TextArea(1, 6)]
        private string message;

        public string Type => type;
        public string Title => title;
        public string Message => message;

        public HelpWindowProfile()
        {
            this.type = this.title = this.message = "None";
        }
    }
}

これで Project で右クリックから[Create -> Create HelpWindowProfileList]でプロファイルが作成できるようになります。

作成したプロファイルにアプリ内で生成されるオブジェクトのタイプとそれに対応するヘルプウィンドウのメッセージを定義します。

後は以下の反映用スクリプトを作成し、ヘルプウィンドウをプレハブ化しました。
・HoloMonHelpWindowSetter.cs

using TMPro;
using UnityEngine;
using UnityEngine.Serialization;

namespace HoloMonApp.Content.SupportItem.Objects.HelpWindow
{
    public class HoloMonHelpWindowSetter : MonoBehaviour
    {
        [SerializeField, Tooltip("ヘルパー種別")]
        private string p_HelpType;
        
        [SerializeField, Tooltip("プロファイル")]
        private HelpWindowProfileList p_HelpWindowProfileList;

        [FormerlySerializedAs("p_title")] [SerializeField, Tooltip("タイトル参照")]
        private TMP_Text p_Title;

        [SerializeField, Tooltip("メッセージ参照")]
        private TMP_Text p_Message;

        [ContextMenu("RefreshHelpWindow")]
        public void RefreshHelpWindow()
        {
            var helpWindowProfile = p_HelpWindowProfileList.GetProfileByType(p_HelpType);

            p_Title.text = helpWindowProfile.Title;
            p_Message.text = helpWindowProfile.Message;
        }
    }
}

これでオブジェクト側から種類を指定することで共通のプレハブでヘルプウィンドウを呼び出す仕組みの準備ができました。