Новое в 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
не бесполезно, потому что здесь была спрятана фактическая логика. Этот класс не предназначался для создания экземпляра, а всего лишь хоста этого сценария метода инициализации, который должен быть запущен.
Если вы воспользуетесь этой возможностью для изменения статических переменных, вы сможете создать свою собственную сериализуемую файловую систему конфигурации по своему усмотрению! Вот и все.