- Home /
ScriptableObject living outside of an asset file
To first give a bit of background, I'm working on an item description system. You get a base item with 3d model, and then you can add attributes to it: stackable, tradable, equippable...
I wanted a flexible way to describe those attributes, so what I've gone for instead is to create classes (Stackable, Tradable, ...), and made it so I can add instances of these attributes to my item description (so I can e.g. say this item is Stackable with a stack limit of 50).
This leaves me with a ScriptableObject class (ItemDescription) that can contain references to several other ScriptableObject instances (ItemAttribute daughter classes such as Stackable).
Now, if I create and attach these ItemAttribute instances via an Editor window, it all looks fine until I hit "Play" where they vanish into thin air (the Editor reports "Missing"). After a bit of digging around, it seems I am forced to use
AssetDatabase.AddObjectToAsset(attribute, itemDescription);
which is rather cumbersome.
Here is a simple reproducer. You can create an asset file via "Create -> Test -> SOTest", and attach another SO to it by hitting the "Test" button. If you hit Play, it'll go away:
[CreateAssetMenu(fileName = "ScriptableObjectTest", menuName = "Test/SOTest")]
public class SOTest : ScriptableObject
{
public OtherSO other;
}
public class OtherSO : ScriptableObject
{
public int value;
}
[CustomEditor(typeof(SOTest))]
public class CapabilityEditor : Editor
{
private SOTest Target { get => (SOTest)this.target; }
public override void OnInspectorGUI()
{
DrawDefaultInspector();
// Simple button to attach an instance of OtherSO to SOTest
if (GUILayout.Button("Test"))
{
Target.other = (OtherSO)ScriptableObject.CreateInstance<OtherSO>();
// Uncommenting this "fixes" the issue
//AssetDatabase.AddObjectToAsset(Target.other, Target);
EditorUtility.SetDirty(Target);
}
}
}
Now, I don't really like having to manually handle the asset file - that's the kind of things I expect Unity to do for me. I would've hopped to have a behaviour similar to say a Serialized int and have it "just work".
Am I doing something wrong here? Is there a better way to handle this kind of hierarchy? Or is it just that ScriptableObjects cannot live outside of asset files?
Your answer
Follow this Question
Related Questions
Get list of all "Action" classes 1 Answer
Unity inspector scripting - scriptable objects - card game 0 Answers
Stop a MonoBehavior from being addable as a script? 0 Answers
Scriptable Objects, how to force Include in Compile / Build without referencing it in the scene? 1 Answer
Custom asset icons changed after upgrade to Unity 2017.2 0 Answers