MRが楽しい

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

HoloLens2でホロモンアプリを作る その124(アイテムのスポーン処理を一括管理するコンポーネントを作成する)

本日はアプリ作成枠です。
HoloLens2でホロモンアプリを作る進捗を書き留めていきます。
今回はアイテムのスポーン処理を一括管理するコンポーネントを作成しました。

アイテムのスポーン処理を一括管理する

以下のようなアイテムのスポーンコンポーネントを作成しました。
指定されたアイテムの種別や追加設定に基づいて、適切なアイテムをシーン内にスポーンします。
・ItemSpawnAPI.cs

namespace HoloMonApp.Content.SupportItem.Spawn
{
    public class ItemSpawnAPI : MonoBehaviour
    {
        [SerializeField]
        private SpawnItemProfileList _spawnItemProfileList;

        [SerializeField]
        private SpawnControlSettings _spawnControlSettings;

        // 呼び出し例        
        public void SpawnItemMeatFood(Pose pose, bool withStand)
            => SpawnItem(SpawnItemType.MeatFood, pose, 1.0f, SpawnItemType.MeatFoodFloatingStand);

        public void SpawnItemBallToy(Pose pose, bool withStand)
            => SpawnItem(SpawnItemType.BallToy, pose, 1.0f, SpawnItemType.BallToyFloatingStand);

        /// <summary>
        /// スポーン処理
        /// </summary>
        private BItemAccessAPI SpawnItem(SpawnItemType type)
        {
            BItemAccessAPI spawnItem = _spawnItemProfileList.GetProfileByType(type).AccessAPI;
            spawnItem.SpawnObject();

            return spawnItem;
        }
        
        /// <summary>
        /// スポーン処理(スポーン場所の指定)
        /// </summary>
        private BItemAccessAPI SpawnItem(SpawnItemType type, Pose pose)
        {
            BItemAccessAPI spawnItem = SpawnItem(type);
            // 回転は水平に補正する
            spawnItem.SetPosition(pose.position);
            spawnItem.SetRotation(Quaternion.Euler(0.0f, pose.rotation.eulerAngles.y, 0.0f));

            return spawnItem;
        }
        
        /// <summary>
        /// スポーン処理(大きさの指定)
        /// </summary>
        private BItemAccessAPI SpawnItem(SpawnItemType type, Pose pose, float ratio)
        {
            BItemAccessAPI spawnItem = SpawnItem(type, pose);
            spawnItem.SetScale(Vector3.one * ratio);

            return spawnItem;
        }
        
        /// <summary>
        /// スポーン処理(スタンドの指定)
        /// </summary>
        private BItemAccessAPI SpawnItem(SpawnItemType type, Pose pose, float ratio, SpawnItemType standType)
        {
            BItemAccessAPI spawnItem = SpawnItem(type, pose, ratio);
            SpawnItem(standType, pose, ratio);

            return spawnItem;
        }
    }
}

各種タイプとそれに対応するアイテムオブジェクトの参照は以下のように保持しています。
現状は過去実装からの移行のため、既にシーンに生成済みのゲームオブジェクトを参照しています。
・SpawnItemProfileList.cs

using System;
using System.Collections.Generic;
using System.Linq;
using HoloMonApp.Content.SupportItem.Objects;
using UnityEngine;
using UnityEngine.Serialization;

namespace HoloMonApp.Content.SupportItem.Spawn
{
    /// <summary>
    /// アイテムスポーン
    /// TODO: 固定参照での仮実装, Initiate()に差し替え予定
    /// </summary>
    [Serializable]
    public enum SpawnItemType
    {
        Nothing = 0,
        MeatFood = 11,
        BallToy = 21,
        ShowerHeadGimmick = 31,
        HitWaterGimmick = 32,
        CardboardBoxOrnament = 41,
        PoopDroppings = 51,
        ManualWindow = 61,
        CreditWindow = 62,
        HelpWindow = 63,
        FloatingStand = 71,
        MeatFoodHelpWindow = 101, // Initiate差し替えまでの仮実装
        MeatFoodFloatingStand = 102, // Initiate差し替えまでの仮実装
        BallToyHelpWindow = 103, // Initiate差し替えまでの仮実装
        BallToyFloatingStand = 104, // Initiate差し替えまでの仮実装
        ShowerHeadGimmickHelpWindow = 105, // Initiate差し替えまでの仮実装
        ShowerHeadGimmickFloatingStand = 106, // Initiate差し替えまでの仮実装
    }

    [Serializable]
    public class SpawnItemProfile
    {
        [SerializeField]
        private SpawnItemType spawnItemType;
        
        [SerializeField]
        private BItemAccessAPI itemAccessAPI;

        public SpawnItemType Type => spawnItemType;
        public BItemAccessAPI AccessAPI => itemAccessAPI;

        public SpawnItemProfile()
        {
            spawnItemType = SpawnItemType.Nothing;
            itemAccessAPI = null;
        }
    }

    [Serializable]
    public class SpawnItemProfileList
    {
        [SerializeField]
        private List<SpawnItemProfile> spawnItemProfileList = new();

        public SpawnItemProfile GetProfileByType(SpawnItemType type) => 
            spawnItemProfileList.FirstOrDefault(profile => profile.Type == type) ??
            new SpawnItemProfile();
    }
}

全てのアイテムオブジェクトに同じ基底クラス(BItemAccessAPI)を継承するコンポーネントを割り当てたので以下のように様々な種類のアイテムを一括でインスペクターからスポーン管理できるようになりました。