Unity 6.3
0 онлайн 88 гостей 3 в системе
Вход
Модульная игровая архитектура на ScriptableObjects Глава 2 из 12 Оригинал, стр. 6

Что такое ScriptableObject?

Русский

Что такое ScriptableObject?

ScriptableObject - это объект Unity, который не является частью экземпляра GameObject. На его основе можно создать пользовательский класс с собственными переменными и методами, но с меньшими накладными расходами, чем у MonoBehaviour. У ScriptableObject нет Transform, и он находится вне иерархии сцены. Такой объект существует на уровне проекта в виде ассета, подобно материалу или 3D-модели. Объявить ScriptableObject можно следующим образом:

C#
[CreateAssetMenu(fileName="MyScriptableObject")] public class MyScriptableObject: ScriptableObject { public int someVariable; }

Как видно из приведенного кода, класс наследуется не от MonoBehaviour, а от ScriptableObject. ScriptableObject нельзя напрямую прикрепить к GameObject. Вместо этого атрибут CreateAssetMenu добавляет соответствующую команду в меню.

Откройте Assets > Create > MyScriptableObject или щелкните правой кнопкой мыши в окне Project, чтобы создать пользовательский ассет на основе класса ScriptableObject.

Создание ScriptableObject

После этого любой другой скрипт сможет ссылаться на данный ассет ScriptableObject из любой сцены с помощью поля:

C#
public class MyMonoBehaviour : MonoBehaviour { public ScriptableObject soInstance; }

Объекты ScriptableObject особенно полезны для данных, которые не требуется изменять во время выполнения.

Объекты ScriptableObject являются полноправными объектами Unity, поэтому их можно: - Хранить в переменных - Динамически создавать и уничтожать во время выполнения - Передавать в качестве аргументов - Возвращать из методов - Включать в структуры данных - Сериализовать и десериализовать Последний пункт отражает одну из ключевых особенностей объектов ScriptableObject: они могут отображаться в окне Inspector. Благодаря этому их поля удобно просматривать и изменять в редакторе Unity. Если изменить значения объекта ScriptableObject во время выполнения, игра обновится сразу. После выхода из режима Play эти значения сохранятся. Это удобно для гейм-дизайнеров, которым нужно настраивать баланс без написания кода. Кроме того, объекты ScriptableObject часто сохраняют изменения во время работы приложения, что дает им ряд преимуществ по сравнению с использованием только MonoBehaviour.

Сериализация Сериализация - это автоматическое преобразование структур данных или состояний объектов в формат, который удобно хранить и позднее восстанавливать. Система сериализации Unity собирает разрозненные в памяти данные и располагает их последовательно. Полученный поток данных можно сохранить в базе данных, файле или памяти. Десериализация выполняет обратное преобразование.

Сериализация

Объект

Файл

Байты

Десериализация

Байты

Объект

База данных

Память

Сериализация преобразует объект в поток байтов, чтобы сохранить его либо передать в память, базу данных или файл.

При разработке на C# легко не задумываться об организации памяти, однако важно знать, какие встроенные возможности Unity используют сериализацию: - Сохранение и загрузка: если открыть файл сцены .unity в текстовом редакторе и включить принудительную текстовую сериализацию, сериализатор будет использовать YAML в качестве внутреннего формата.

- Окно Inspector: этот интерфейс не обращается к API C#, чтобы получить значения проверяемого объекта. Вместо этого он просит объект сериализовать себя и отображает полученные данные. - Префабы: внутри префаб представляет собой сериализованный поток данных объектов GameObject и компонентов. Экземпляр префаба хранит список изменений, которые следует применить поверх сериализованных данных. - Создание экземпляра: при создании экземпляра префаба или объекта GameObject на сцене Unity сериализует исходный объект, создает новый, а затем десериализует данные в новый объект. Подробнее о сериализации в Unity см. в этой статье блога и видео «Как работает система сериализации Unity».

English

What are ScriptableObjects?

A ScriptableObject is a Unity object that’s not part of a GameObject instance. You can use it to create a custom class with its own variables and methods, but with less overhead than a MonoBehaviour. A ScriptableObject does not have a Transform and exists outside of the Scene Hierarchy. Instead, it lives at the project level as an asset, much like a material or 3D model. You can declare a ScriptableObject like this:

C#
[CreateAssetMenu(fileName="MyScriptableObject")] public class MyScriptableObject: ScriptableObject { public int someVariable; }

As you can see in the code above rather than deriving from MonoBehaviour, you inherit from ScriptableObject. You can’t use this directly on a GameObject. Instead, the CreateAssetMenu attribute gives you an extra action in your menus.

Navigate to Assets > Create > MyScriptableObject (or right-click in the Project window), and you can instantiate a custom asset from your ScriptableObject class.

Creating a ScriptableObject

Any other script can then reference this ScriptableObject asset from any scene, using a field:

C#
public class MyMonoBehaviour : MonoBehaviour { public ScriptableObject soInstance; }
ScriptableObjects are especially useful for anything that doesn’t need to change at runtime.

Because Unity treats ScriptableObjects as first-class objects, you can: —

Store them in variables

Dynamically create or destroy them at runtime

Pass them as arguments

Return them from a method

Include them in data structures

Serialize/deserialize them

This last bullet point highlights one of ScriptableObjects’s key features: the ability to appear in the Inspector. This means that its fields are easy to read and modify in the Editor. Change values in a ScriptableObject at runtime, and your game application updates immediately. Exit Play mode, and those values remain in place. This makes them useful for game designers who need to balance game settings without having to write code. As a plus, ScriptableObjects can often store changes while the application is running. This offers a few advantages over using MonoBehaviours alone.

Serialization Serialization is the automatic process of transforming data structures or object states into a format that’s easier to store and reconstruct later. Unity’s serialization backend takes data that’s scattered over memory and then lays it out sequentially. This reorganized data stream then can be stored in a database, a file, or memory. “Deserialization” is the reverse process.

Serialization is the process of converting an object into a stream of bytes to store the object or transmit it to memory, a database, or a file.

Although memory layout is easy to overlook in C# development, we should be aware of several built-in Unity features that use serialization: —

Saving and loading: If you open a .unity scene file with a text editor and have set unity to “force text serialization,” the serializer is run with a YAML backend.

The Inspector window: This interface doesn’t talk to the C# API to figure out the values of whatever it’s inspecting. Instead, it asks the object to serialize itself and displays the serialized data.

Prefabs: Internally, a prefab is the serialized data stream of GameObjects and components. A prefab instance is a list of modifications that should be made on top of the serialized data.

Instantiation: When you instantiate a prefab (or a GameObject that lives in the scene), you serialize the object, create a new object, and then deserialize the data onto the new object.

For more information about serialization in Unity, see this blog post or watch “How Unity’s Serialization system works.”