Столкнулся с проблемой в системе предметов.
Было:
Базовый 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
};
}
}
}
}