c# - 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 基本类型的任何类型吗?
谢谢!
解决方案
我可能会误解,但是通过一些小的更改,您肯定可以将继承的可编写脚本的对象添加到您的库存槽中。
[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() 方法中进行初始化。我已在基类中将该方法声明为虚拟方法,因此我们可以覆盖它但仍然调用它。
推荐阅读
- mysql - 卸载 MAMP 后如何恢复我的网站?
- angular - 访问 Angular 类中的受保护方法
- java - getPrincipal() 方法返回用户名而不是 UserDetails
- android - 将实时数据从 Firebase DB 检索到谷歌地图的问题
- wpf - WPF扩展器单击事件上的展开/折叠网格列
- css - Flexbox 容器问题,忽略宽度和高度
- c - 如何将 exec 输出存储到文件中?
- android - 如果持有人中的物品已移除,如何交换总数?
- python - FileNotFoundError: [Errno 2] 没有这样的文件或目录。Ubuntu
- python - 在 Python 中获取原始电子邮件发件人服务器