Абстрактный класс ScriptableObject: доступ к дочерней переменной

avatar
Mario Hess
8 августа 2021 в 17:13
533
1
1

Я пытаюсь создать систему предметов для своей игры, но не могу получить доступ к различным переменным в моих Sriptable Objects, которые наследуются от одного и того же абстрактного класса.

У меня есть абстрактный класс, производный от SriptableObject:

//ItemObject
public abstract class ItemObject : ScriptableObject
{
    public GameObject prefab;
    public ItemType type;
    public string itemName;
    [TextArea(15,10)]
    public string description;
}

//ItemType
    public enum ItemType
    {
        Potion,
        Weapon,
        Default
    }

Я создаю ItemController, который находится на GameObject:

//ItemController
public class ItemController : MonoBehaviour
{
    public ItemObject item;
}

Я создаю Scriptable Object, производный от ItemObject, и подключаю созданный Scriptable Object к ItemController Script:

//WeaponObject
[CreateAssetMenu(fileName = "New Weapon Object", menuName = "Inventory System/Items/Weapon")]
public class WeaponObject : ItemObject
{
    public float atkBonus;
    public float defBonus;
    
    private void Awake()
    {
        type = ItemType.Weapon;
    }
}

Я пытаюсь выполнить Raycast для объекта, на котором находится ItemController, и я пытаюсь получить доступ к переменной atkBonus из моего WeaponObject.

//PlayerController
 private void Update()
    {
        RaycastHit hit;
        if (Physics.Raycast(this.transform.position, this.transform.forward, out hit, 2f))
        {
            var itemObject = hit.transform.GetComponent<ItemController>();
            if(itemObject)
            {
                Debug.Log(itemObject.item.atkBonus);
            }    
        } 
    }

Это выдает ошибку, и я не могу понять, почему. "ошибка: "ItemObject" не содержит определения для "atkBonus" и нет доступного метода расширения "atkBonus"..."

Я могу получить доступ к переменным из родительского абстрактного класса, но

Debug.Log(itemObject.item.itemName);

Кто-нибудь знает, как это решить?

Спасибо.

Источник

Ответы (1)

avatar
Daniel
8 августа 2021 в 17:32
1

Вместо

Debug.Log(itemObject.item.atkBonus);

попробовать

WeaponObject wo = (WeaponObject) itemObject.item;
Debug.Log(wo.atkBonus);
Tengiz
25 января 2022 в 11:55
0

Разве он не создает еще один экземпляр этого ScriptableObject, в то время как вся их цель заключалась в том, чтобы уменьшить количество клонов и получить доступ к его свойствам из любого места? Так что это в основном похоже на одноэлементный объект, который я должен создавать еще одну копию всякий раз, когда я хочу получить доступ к его свойствам?