ScriptableObject это класс, который позволяет вам хранить большое количество передаваемой информации независимо от образцов скрипта. Не путайте этот класс с классом под названием SerializableObject, который является классом редактора и служит для других целей. Представьте на мгновение, что вы создали префаб со скриптом, который имеет массив из миллиона целых чисел. Массив занимает 4 мегабайта памяти и принадлежит префабу. Каждый раз создавая экземпляр этого префаба, вы создаёте и экземпляр этого массива. Если вы создадите 10 игровых объектов, тогда в итоге размер занимаемый массивами для этих 10 экземпляров будет равен 40 мегабайтам.
Unity сериализует все типы примитивов, строк, массивов, списков, специфичных типов для Unity, таких как Vector3 и ваших собственных классов с атрибутом Serializable в качестве копий, относящихся к объекту, в котором они определены. Данное означает, что если вы создали класс ScriptableObject и сохранили в нём объявляемый массив из миллиона целых чисел, тогда этот массив будет передаваться вместе с этим образцом. При этом экземпляры считают, что обладают разными данными. Поля ScriptableObject или любые UnityEngine.Object поля, такие как MonoBehaviour, Mesh, GameObject и т.д, в противоположность значениям хранятся в ссылках. Если у вас есть скрипт, ссылающийся на ScriptableObject, содержащий миллион целых чисел, Unity сохранит в данных скрипта лишь ссылку на ScriptableObject. ScriptableObject в свою очередь хранит массив. 10 экземпляров префаба, которые ссылаются на класс ScriptableObject, который использует 4 мегабайта памяти, в итоге заняли бы 4 мегабайта вместо 40, о которых шла речь немного раньше.
Класс ScriptableObject необходимо использовать в тех случаях, когда нужно снизить расход памяти путём избежания копирования значений, но его также можно использовать для определения включаемых наборов данных. В качестве примера для иллюстрации его работы представьте себе NPC магазин в РПГ игре. Вы можете создать несколько ассетов вашего ShopContents (содержимого магазина) ScriptableObject, каждый из которых определял бы набор предметов, доступных для покупки. В случае, когда игра разделена на три зоны, в каждой зоне продаются свои предметы. Скрипт вашего магазина будет ссылаться на объект ShopContents, чтобы определить какие предметы доступны в данный момент. Для большего количества примеров, пожалуйста посетите руководство по скриптингу.
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 (скриптуемого объекта). Вы также можете создать пользовательский редактор для определения вида инспектора своего типа, чтобы помочь управлять данными, которые он представляет.