MRが楽しい

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

HoloLens2でホロモンアプリを作る その128(育成メニューで利用可能なパネルの表示順を動的に管理する)

本日はアプリ作成枠です。
HoloLens2でホロモンアプリを作る進捗を書き留めていきます。
今回は育成メニューで利用可能なパネルの表示順を動的に管理する処理を追加しました。

育成メニューで利用可能なパネル

ホロモンアプリでは手のひらを出したときに、様々な操作が行えるメニューパネルを手に追従して表示しています。

様々なデバッグ操作もこのメニューパネル内の一枚で一括管理しているので状況に応じて各パネルの有効無効を Inspector の設定で切り替えられるようにしました。

このとき、メニューのページ送りで無効なページを飛ばすため、有効無効を考慮してインデックスを返す処理を実装しました。
Enumerable の Select を利用すると、条件に合致する値の配列のインデックスを取得することができます。
bluebirdofoz.hatenablog.com

実装コード

以下のようなクラスを実装しました。
GetUsableActiveProfileByIndex 関数、GetUsableIndexByStatus 関数では有効無効を考慮した配列のインデックスが使用されます。
・ActiveProfileList.cs

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

namespace HoloMonApp.Content.SupportItem.Objects.Windows.BreedingMenuWindow
{
    [Serializable]
    public class ActiveProfile
    {
        [FormerlySerializedAs("status")] [SerializeField] private ItemBreedingMenuWindowPanelType panelType;

        [SerializeField] private bool useActive;

        public ItemBreedingMenuWindowPanelType PanelType => panelType;
        public bool UseActive => useActive;
    }
    
    [Serializable]
    public class ActiveProfileList
    {
        /// <summary>
        /// アクティブ情報の対応登録リスト
        /// </summary>
        [SerializeField] private List<ActiveProfile> activeProfileList;

        /// <summary>
        /// 全アクティブ情報のリスト
        /// </summary>
        public IReadOnlyList<ActiveProfile> GetActiveProfileListAll =>
            activeProfileList.ToList();
        
        /// <summary>
        /// 現在利用可能なアクティブ情報のリスト
        /// </summary>
        public IReadOnlyList<ActiveProfile> GetUsableActiveProfileList =>
            activeProfileList
                .Where(profile => profile.UseActive)
                .ToList();

        /// <summary>
        /// 指定ステータスに対応するアクティブ情報を取得する
        /// </summary>
        /// <param name="panelType"></param>
        /// <returns></returns>
        public ActiveProfile GetUsableActiveProfileByStatus(ItemBreedingMenuWindowPanelType panelType) =>
            activeProfileList
                .Where(profile => profile.UseActive)
                .First(profile => profile.PanelType == panelType);

        /// <summary>
        /// 指定インデックスに対応するアクティブ情報を取得する
        /// </summary>
        /// <param name="status"></param>
        /// <returns></returns>
        public ActiveProfile GetUsableActiveProfileByIndex(int index) =>
            activeProfileList
                .Where(profile => profile.UseActive)
                .Select((profile, index) => (profile, index))
                .First(profile => profile.index == index).profile;

        /// <summary>
        /// 指定ステータスに対応するアクティブ情報のインデックスを取得する
        /// </summary>
        /// <param name="panelType"></param>
        /// <returns></returns>
        public int GetUsableIndexByStatus(ItemBreedingMenuWindowPanelType panelType) =>
            activeProfileList
                .Where(profile => profile.UseActive)
                .Select((profile, index) => (profile, index))
                .First(data => data.profile.PanelType == panelType).index;
    }
}

実際にはパネル順序の管理自体をクラスに閉じてしまいたいですが、今回は既存の実装に合わせこませるためにインデックスで管理する形に実装しています。