- Home /
ScriptableObject error with Inheritance
here is the error i recieve:
the error is on this line.:
if (pItem.isStackable)
{
}
I should note that the error only occurs when I build the game. It does not occur when I run the game in the editor.
I believe the error comes from trying to give the player a weapon in their inventory.
because this runs fine:
Player.playerInv.AddItem(apple);
and this doesn't:
Player.playerInv.AddItem(sword2);
the only difference is apple is an item and Sword2 is a weapon... I have reason to believe that the build is expecting an Item to be loaded and not a weapon. (Weapon is a child of item. item inherits ScriptableObject).
here is the code for weapons and items (sorry for large file):
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 pID, string pName, string pInfo, int pWorth, Dictionary<string, 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, string pName, string pInfo, int pWorth, Dictionary<string, int> pStatsfloat, int pDamage, GameObject pWeaponPrefab) : base(ItemType.Equipment,pID, pName, pInfo,pWorth,pStatsfloat)
{
Damage = pDamage;
WeaponModelPrefab = pWeaponPrefab;
}
}
Answer by Arcturus125 · Nov 12, 2020 at 12:36 AM
I made an identical post here once this post went stale: https://stackoverflow.com/questions/64780739/scriptableobject-build-error-with-inheritance-but-runs-fine-in-unity-editor
it turns out I was running some old code by accident. the constructors in both Item and Weapon were completely unnecessary.
in the other thread, I found out that constructors don't work well with scripts inheriting ScriptableObject, because unity handles the construction of a scriptable object for you... my constructors managed to interfere with that. luckily I didn't need the constructors anyway and left them there by accident. after removing them, the code worked fine,
Answer by jackmw94 · Nov 11, 2020 at 01:52 AM
Both ScriptableObjects and MonoBehaviours are required to exist within files that have the filename matching the class name. Given that both of these look like they're in a single file, I'm guessing there's an issue with one of them.
This took me ages to debug the first time I ran into this!
I tried putting the weapon class in a different file. and nothing. it still has the same error message. Any other ideas?
Damn. Sanity check that the file names are definitely Item and Weapon, but I do believe you ;)
It may be because dictionaries aren't serializable by unity? I'd have expected it to warn you a little better than that but you might run into problems there.
If that is the case then you might have to resort to having a list of pairs then creating the dictionary during initialisation. Alternatively Odin Inspector handles dictionary serialization and is amazing! I'll let you see whether that helps before continuing..
I tried removing the dictionary since I didn't really utilise it much. same error
Your answer
Follow this Question
Related Questions
A scripted Object has a different layout when loading: scriptable objects and inheritance 1 Answer
An OS design issue: File types associated with their appropriate programs 1 Answer
Calling a derived class (Serialized in a Scriptable Object) returns the super class. 1 Answer
Copy reference from one component to another derived component., 2 Answers