ScriptableObject's are great to store all sorts of data. There are good talks available if you're not familiar with it, here is one of my favorites: Spoiler: Unite 2016 - Overthrowing the MonoBehaviour Tyranny in a Glorious Scriptable Object Revolution I've used ScriptableObject's for years, it's a genius invention. However, in pretty much every project we ended up to implement a Component-like system for ScriptableObject eventually. The idea is have a SO that acts as container for other SO's. We called the container "Config" and the components "Modules", to not confuse with Unity Components. Means this system is similar to how a GameObject acts as container for Component/MonoBehaviour. The purpose of having those SO modules was to be able to group data without affecting the code maintainability in terms of monolithic ScriptableObject .cs files. Rather than having a single ScriptableObject .cs file that contains everything for a specific feature, such as an Enemy, there would exist a Config for the Enemy and several modules added to the Config provide the specific data. One module could be "balancing stats" including things such as health, another module could be what skills the Enemy can execute, another module could be how the Enemy appears in the UI, and so on. You get the idea. HUD related code doesn't have to care about the "balancing stats" module and can just query the UI module for example. However, at another point you realize all this is great, but you also need a template-like system. Basically a system to derive from another ScriptableObject, inherit all its values and allow to override them. Unity's prefab variant system basically. In more recent projects, since nested prefabs arrived, I've used Prefabs rather than ScriptableObject's as data containers. The GameObject acts as the container and the Components represent the data, which previously was the "SO module". Using the Prefab system for that also allows to use its variant system, to get template-functionality for free. These "data prefabs" are kept in the project folder, just like a ScriptableObject would be. From a coding point of view, not much changed. Rather than accessing the SO, you access the GameObject and use GetComponent to get your hands on the data, where the Component is what previously was represented by a ScriptableObject. Has anyone else used prefabs as data containers too? What are your thoughts on it?