带有继承的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中绕过了构造函数的设置,这通常会导致序列化问题。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...