如何解决带有继承的ScriptableObject构建错误,但在Unity Editor中运行良好
这是我收到的错误:
此行中有错误。
if (pItem.isstackable)
{
}
我应该注意,错误仅在构建游戏时发生。当我在编辑器中运行游戏时,不会发生这种情况。
我相信错误是由于试图为玩家提供库存中的武器。
因为它运行良好:
Player.playerInv.AddItem(apple);
这不是:
Player.playerInv.AddItem(sword2);
唯一的区别是苹果是一个物品,而Sword2是一种武器……我有理由相信,该构建版本希望装载一个物品而不是武器。 (武器是item的子项。item继承了ScriptableObject)。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "Item",menuName = "StrangeEngine/Item",order = 2)]
public class Item : ScriptableObject
{
public enum ItemType
{
Item = 1,Skill = 2,Equipment = 3
}
public ItemType type;
public int ID;
public string itemName;
public string info;
public int worth;
public bool isstackable = false;
//public Sprite icon;
public Dictionary<string,int> itemStats = new Dictionary<string,int>(); // "stats" that come in pairs,a name (string) and a number. for example ("weight",22)
public Item(ItemType pType,int pID,string pName,string pInfo,int pWorth,Dictionary<string,int> pStats)
{
type = pType;
ID = pID;
itemName = pName;
info = pInfo;
worth = pWorth;
itemStats = pStats;
}
public Item(ItemType pType,int> pStats,bool pIsstackable)
{
type = pType;
ID = pID;
itemName = pName;
info = pInfo;
worth = pWorth;
itemStats = pStats;
isstackable = pIsstackable;
}
}
[CreateAssetMenu(fileName = "Item",menuName = "StrangeEngine/Weapon",order = 3)]
public class Weapon : Item
{
public int damage;
public GameObject WeaponModelPrefab;
public Weapon(int pID,int> pStatsfloat,int pdamage,GameObject pWeaponPrefab) : base(ItemType.Equipment,pID,pName,pInfo,pWorth,pStatsfloat)
{
damage = pdamage;
WeaponModelPrefab = pWeaponPrefab;
}
}
解决方法
我在这里可以看到几个警告标志。但是,尤其是,该错误可能与使用构造函数有关。对于ScriptableObject
类型,您应该让Unity处理构造项目。
ScriptableObject
通常用于序列化数据以便在运行时使用。之后,可以在整个游戏中使用SO。但是使用here中所述的CreateInstance
方法创建新文件应该很简单。
无论如何,您的构造函数都只是设置私有字段。您可以从调用代码中分配它们,而不必将其作为构造函数参数传递。
另外一点,您应该意识到Unity不会序列化字典。您可以序列化List<T>
并使用ISerializationCallbackReceiver接口将列表反序列化为Dictionary
SO也确实收听了少数Unity消息。因此,例如,您可以使用Awake消息进行任何SO初始化。您可以在this页上找到SO消息的快速摘要。
总而言之,我相信您的问题是您从继承的SO中绕过了构造函数的设置,这通常会导致序列化问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。