首页 > 解决方案 > Unity - 将具有继承类型的对象添加到继承类型的字段

问题描述

我有一个库存系统,可以接收 BaseItem 类型的项目。我对此进行了扩展,以添加从 BaseItem 继承的新类型的项目,并且我希望能够将这些项目动态添加到库存或通过编辑器。

库存槽:

[System.Serializable]
public class InventorySlot
{
    public BaseItem item = new BaseItem();
    public int amount;

    public InventorySlot()
    {
        item = new BaseItem();
        amount = 0;
    }

    ect.
}

基础项目:

[System.Serializable]
public class BaseItem : ScriptableObject {
    public string name;
    public int id = -1;
    public Sprite uiDisplay;

    public BaseItem() {
        name = "";
        id = -1;
    }

    ect.
}

这非常有效,因为我能够在编辑器中定义一堆项目并将它们动态添加到我的库存中。我试图通过添加扩展 BaseItem 的新项目类型来扩展这一点,例如

[CreateAssetMenu(fileName = "New Item", menuName = "Inventory System/Items/magical")]
[System.Serializable]
public class MagicalItem : BaseItem {
    public string passive;

    public MagicalItem(string passive, BaseItem item) : base(item) {
        this.passive = passive;
    }
}

但我无法将这些物品添加到我的库存槽中。知道如何允许 InventorySlot 接收具有 BaseItem 基本类型的任何类型吗?

谢谢!

标签: c#unity3d

解决方案


我可能会误解,但是通过一些小的更改,您肯定可以将继承的可编写脚本的对象添加到您的库存槽中。

[System.Serializable]
public class InventorySlot : MonoBehaviour
{
    public BaseItem item;
}
[CreateAssetMenu(fileName = "Base Item", menuName = "Inventory System/Items/Base")]
[System.Serializable]
public class BaseItem : ScriptableObject
{
    public string name;
    public int id = -1;
    public Sprite uiDisplay;

    protected virtual void Awake()
    {
        name = "";
        id = -1;
    }
}
[CreateAssetMenu(fileName = "Magic Item", menuName = "Inventory System/Items/Magical")]
[System.Serializable]
public class MagicalItem : BaseItem
{
    public string passive;

    protected override void Awake()
    {
        base.Awake();
        this.passive = "whatever...";
    }
}

请注意,可编写脚本的对象不应使用构造函数,而应在 Awake() 方法中进行初始化。我已在基类中将该方法声明为虚拟方法,因此我们可以覆盖它但仍然调用它。


推荐阅读