Задать вопрос
MinZeroMax
@MinZeroMax

Как правильно ограничить выбор enum значений в инспекторе для разных типов предметов?

Столкнулся с проблемой в системе предметов.

Было:
Базовый ItemConfig с общим enum ItemType (оружие, броня и т.д.)
Наследники WeaponConfig и ClothesConfig

Проблема:
В инспекторе можно было назначить оружию тип брони или наоборот — это ломало логику.

Сейчас сделал так:
Разделил enum'ы: WeaponType (меч, лук) и ArmorType (шлем, доспех)
В WeaponConfig оставил только WeaponType, в ClothesConfig — только ArmorType

Вопрос:
Это нормальный подход, или есть более правильные способы? Хочется:
Чтоб в инспекторе нельзя было выбрать не те типы
Сохранить понятную структуру кода

Если знаете варианты лучше — подскажите. Спасибо!

namespace MainProject.Items
{
    public enum ItemType
    {
        None,
        //clothes
        Armor,
        Boots,
        Helmet,
        //weapons
        WeaponOneHanded,  
        WeaponTwoHanded,  
        OffHand
    }
    public enum WeaponType
    {
        None,
        WeaponOneHanded,
        WeaponTwoHanded,
        OffHand
    }

    public enum ArmorType
    {
        None,
        Helmet,
        Armor,
        Boots
    }
}


using UnityEngine;

namespace MainProject.Items.Config
{
    public abstract class ItemConfig : ScriptableObject
    {
        [field: SerializeField] public Sprite Icon { get; private set; }
        [field: SerializeField] public string Name { get; private set; }
        [field: SerializeField] public int MaxStack { get; private set; }
        public abstract ItemType ItemType { get; }

    }
}


using UnityEngine;

namespace MainProject.Items.Config
{
    [CreateAssetMenu(fileName = "ClothesConfig", menuName = "Configs/Items/Clothes")]
    public class ClothesConfig : ItemConfig
    {
        [field: SerializeField] public int PhysProtection { get; private set; }
        [field: SerializeField] public int MagProtection { get; private set; }
        [field: SerializeField] public ArmorType ArmorType { get; private set; }
        public override ItemType ItemType
        {
            get
            {   
                return ArmorType switch
                {
                    ArmorType.Helmet => ItemType.Helmet,
                    ArmorType.Armor => ItemType.Armor,
                    ArmorType.Boots => ItemType.Boots,
                    _ => ItemType.None
                };
            }
        }
    }
}


using UnityEngine;

namespace MainProject.Items.Config
{
    [CreateAssetMenu(fileName = "WeaponConfig", menuName = "Configs/Items/Weapon")]
    public class WeaponConfig : ItemConfig
    {
        [field: SerializeField] public int PhysDamage { get; private set; }
        [field: SerializeField] public int MagDamage { get; private set; }
        [field: SerializeField] public WeaponType WeaponType { get; private set; }

        public override ItemType ItemType
        {
            get
            {
                return WeaponType switch
                {
                    WeaponType.WeaponOneHanded => ItemType.WeaponOneHanded,
                    WeaponType.WeaponTwoHanded => ItemType.WeaponTwoHanded,
                    WeaponType.OffHand => ItemType.OffHand,
                    _ => ItemType.None
                };
            }
        }
    }
}
  • Вопрос задан
  • 29 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы