ScriptableObject is a class that allows you to store large quantities of shared data independent from script instances. Do not confuse this class with the similarly named SerializedObject, which is an editor class and fills a different purpose. Consider for example that you have made a prefab with a script which has an array of a million integers. The array occupies 4MB of memory and is owned by the prefab. Each time you instantiate that prefab, you will get a copy of that array. If you created 10 game objects, then you would end up with 40MB of array data for the 10 instances.
Unity сериализует все типы примитивов, строк, массивов, списков, специфичных типов для Unity, таких как Vector3 и ваших собственных классов с атрибутом Serializable в качестве копий, относящихся к объекту, в котором они определены. Данное означает, что если вы создали класс ScriptableObject и сохранили в нём объявляемый массив из миллиона целых чисел, тогда этот массив будет передаваться вместе с этим образцом. При этом экземпляры считают, что обладают разными данными. Поля ScriptableObject или любые UnityEngine.Object поля, такие как MonoBehaviour, Mesh, GameObject и т.д, в противоположность значениям хранятся в ссылках. Если у вас есть скрипт, ссылающийся на ScriptableObject, содержащий миллион целых чисел, Unity сохранит в данных скрипта лишь ссылку на ScriptableObject. ScriptableObject в свою очередь хранит массив. 10 экземпляров префаба, которые ссылаются на класс ScriptableObject, который использует 4 мегабайта памяти, в итоге заняли бы 4 мегабайта вместо 40, о которых шла речь немного раньше.
The intended use case for using ScriptableObject is to reduce memory usage by avoiding copies of values, but you could also use it to define pluggable data sets. An example of this would be to imagine a NPC shop in a RPG game. You could create multiple assets of your custom ShopContents ScriptableObject, each defining a set of items that are available for purchase. In a scenario where the game has three zones, each zone could offer different tier items. Your shop script would reference a ShopContents object that defines what items are available. Please see the scripting reference for examples.
Once you have defined a ScriptableObject-derived class, you can use the CreateAssetMenu attribute to make it easy to create custom assets using your class.
Подсказка: при работе в инспекторе с экземплярами ScriptableObject вы можете дважды нажать на поле ссылки, чтобы открыть инспектор для своего ScriptableObject (скриптуемого объекта). Вы также можете создать пользовательский редактор для определения вида инспектора своего типа, чтобы помочь управлять данными, которые он представляет.