Scriptable Object Database is the best way to organize and manage your scriptable objects in Unity, forget about trying to organize your scriptable objects by hand with complicated folder structures, with this tool you can create as many scriptable objects as you need contained in a single object, a nice and easy to extend editor window to edit/create your scriptable objects and a custom dropdown to select those objects when you want to reference it from your scripts.
Install from the Unity Asset Store.
Or
Import This Unity package into your project.
If you prefer here is a youtube video.
Longer text version here.
using ArcaneOnyx.ScriptableObjectDatabase;
using UnityEngine;
namespace ArcaneOnyx.InventorySample
{
public class ItemDefinition : ScriptableItem
{
[SerializeField, TextArea] private string description;
[SerializeField] private int stackableAmount;
public int StackableAmount => stackableAmount;
public string Description => description;
}
}
using ArcaneOnyx.ScriptableObjectDatabase;
using UnityEngine;
namespace ArcaneOnyx.InventorySample
{
[CreateAssetMenu(menuName = "Sample/Database/Item Database")]
public class ItemDefinitionDatabase : ScriptableDatabase<ItemDefinition>
{
}
}
using ArcaneOnyx.ScriptableObjectDatabase;
using UnityEditor;
namespace ArcaneOnyx.InventorySample
{
[CustomEditor(typeof(ItemDefinitionDatabase))]
public class ItemDefinitionDatabaseEditor :
ScriptableItemDefaultEditor<ItemDefinitionDatabaseEditorWindow,
ItemDefinitionDatabase, ItemDefinition>
{
}
}
using ArcaneOnyx.ScriptableObjectDatabase;
using UnityEditor;
namespace ArcaneOnyx.InventorySample
{
[CustomEditor(typeof(ItemDefinition))]
public class ItemDefinitionEditor : ScriptableItemEditor<ItemDefinitionDatabaseEditorWindow,
ItemDefinitionDatabase, ItemDefinition>
{
}
}
using ArcaneOnyx.ScriptableObjectDatabase;
using UnityEditor;
using UnityEngine;
namespace ArcaneOnyx.InventorySample
{
public class ItemDefinitionDatabaseEditorWindow :
DatabaseEditorWindow<ItemDefinitionDatabase, ItemDefinition>
{
[MenuItem("Window/Sample/Items Editor")]
public static void OpenEditor()
{
ItemDefinitionDatabaseEditorWindow wnd = GetWindow<ItemDefinitionDatabaseEditorWindow>();
wnd.titleContent = new GUIContent(wnd.GetWindowTitle());
}
public override string GetWindowTitle() => "Item Definition Editor";
}
}
using ArcaneOnyx.InventorySample;
using ArcaneOnyx.ScriptableObjectDatabase;
using UnityEngine;
public class DropdownTest : MonoBehaviour
{
[SerializeField]
[ScriptableItemDatabaseSelector(typeof(ItemDefinitionDatabase))]
private ItemDefinition item;
}
Scriptable Object Database depends on Unity-AdvanceDropdown, so if you want to clone this, you will need to clone both repositories.