微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有继承的ScriptableObject构建错误,但在Unity Editor中运行良好

如何解决带有继承的ScriptableObject构建错误,但在Unity Editor中运行良好

这是我收到的错误

enter image description here

此行中有错误

 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 ,但这取决于您决定是否需要序列化该数据,或者仅在以下位置使用它:运行。您可以找到有关ISerializationCallbackReceiver here的更多信息。

SO也确实收听了少数Unity消息。因此,例如,您可以使用Awake消息进行任何SO初始化。您可以在this页上找到SO消息的快速摘要。

总而言之,我相信您的问题是您从继承的SO中绕过了构造函数的设置,这通常会导致序列化问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。