Новое в 0.4.0, «Объекты инициализации» Addressables заключается не в том, что вы можете получить объект при запуске, это не в том, что вы можете загрузить какой-либо адрес актива сразу при запуске. Смысл в том, что при инициализации необходимо что-то сделать на основе содержимого вашего ScriptableObject «объекта инициализации», который вы можете сериализовать в проекте и настроить для изменения поведения во время выполнения.

Ключевой момент здесь, при инициализации. Существует цикл от «данных реального времени» (rtd) до CreateInstance при инициализации системы Addressables. Кажется, что этот экземпляр создания отбрасывает получившийся объект… почему?

Внутри RTD находится список ObjectIntializationData

Сценарий сборки - это тот, кто поместил ObjectInitializationData в RTD, а затем сериализовал их все в текстовый файл.

Этот aaSettings - это раздел файла настроек. Каждый из них должен произвести ObjectInitializationData для сериализации.

Наличие интерфейса IObjectIntializationDataProvider на вашем ScriptableObject позволяет вам добавить актив в этот список. Этот файл SO будет вашим классом хранения данных файла конфигурации, чтобы определять, что будет происходить при запуске во время выполнения.

Итак, как я могу предоставить это ObjectInitializationData, как указано в требованиях этого интерфейса?

Кажется, что все в этой структуре доступно только для чтения, а конструктора whatseover нет. Разве мы не хотим просто new пустые?

Ниже находится UNITY_EDITOR область, которая содержит единственную точку, которая может создать это struct со значениями внутри.

objectType - это тип, который вы хотите создать во время выполнения. (не то же самое, что и тип файла конфигурации ранее) dataObject будет напрямую ToJson, и вы получите его обратно как string позже, когда сценарий инициализации сделает ваш objectType позже во время выполнения.

Наконец, давайте посмотрим, как ваш сериализованный dataObject вернется к жизни с помощью CreateInstance метода ObjectInitializationData:

Это тот самый бесполезный вызов, упомянутый вверху. Обладая силой активатора отражения для создания экземпляра сериализованного типа, он проверяет IInitializableObject и вызывает Initialize. В этом Initialize основная подсветка, он будет запускать этот код при инициализации. Что ты хочешь делать?

Эти id и data - это те, которые вы указываете при звонке CreateSerializedInitializationData. Они возвращаются сюда во время выполнения.

Давайте посмотрим на единственный пример, который есть в Unity. Это CacheInitializationSettings позволяет вам сохранять некоторые настройки (в форме CacheInitializationData), а затем «что-то делать» в Initialize логике, определенной в классе CacheInitialization. (Это 3 класса, чтобы все заработало)

Этот сценарий SO должен находиться в области действия только РЕДАКТОРА, поскольку мы узнали, что CreateSerializedInitializationData можно использовать только в UNITY_EDITOR. Итак, ресурс, созданный из этого ScriptableObject, представляет собой своего рода файл конфигурации, который имеет смысл только в редакторе. Name также является требованием интерфейса.

Создав файл ресурсов этого типа, мы теперь можем изменять CacheInitializationData по своему усмотрению.

При сборке он будет сериализовать CacheInitializationData (m_data), используя ToJson (то есть строку). Этот класс данных не входит в область видимости редактора, потому что мы будем использовать его вместе во время выполнения, чтобы активировать CacheInitialization ‘s Initialize

Если вы помните с самого начала, к этому придет вызов «выбросить» CreateInstance. CreateInstance будет использовать отражение для создания экземпляра CacheInitialization (у него есть логика, которую мы хотим вызвать при инициализации), затем вызовет Initialize для него, если у него есть интерфейс IInitializableObject (должен, иначе выбросить бесполезно).

Здесь вы видите, что он, наконец, что-то делает с переменной Caching static, используя сериализованные данные, возвращенные к жизни из строки с помощью FromJson. Если вещь была ToJson успешно, FromJson должен дать вам правильный объект.

Теперь вы знаете, что выбросить CreateInstance не бесполезно, потому что здесь была спрятана фактическая логика. Этот класс не предназначался для создания экземпляра, а всего лишь хоста этого сценария метода инициализации, который должен быть запущен.

Если вы воспользуетесь этой возможностью для изменения статических переменных, вы сможете создать свою собственную сериализуемую файловую систему конфигурации по своему усмотрению! Вот и все.