Сериализация для объектов не-Unity: используйте AssemblyReloadEvents или ISerializationCallbackReceiver - PullRequest
0 голосов
/ 05 мая 2019

В настоящее время я пишу Librarian для загрузки объектов сценариев в память и доступа к ним через одноэлементный экземпляр указанного библиотекаря.В дополнение к библиотекарю я пишу инструмент (в качестве настраиваемого окна редактора единиц) для моего игрового дизайнера, чтобы было удобнее настраивать параметры.Проблема, с которой я сталкиваюсь сейчас, заключается в следующем: либо при запуске, либо при открытии инструмента библиотекарь запускается и заставляет его предварительно загрузить большинство необходимых пакетов ресурсов и поднаборов, включенных в них.Хотя, как только запускается горячая перезагрузка (например, я редактирую скрипт, сохраняю его и перекомпилирую Unity), я получаю следующую ошибку, так как объекты сценариев все еще находятся в памяти:

The AssetBundle 'StreamingAssets\roverbundle' can't be loaded because another AssetBundle with the same files is already loaded.

Посленекоторые исследования, которые я узнал о UnityEditor.AssemblyReloadEvents.beforeAssemblyReload и UnityEditor.AssemblyReloadEvents.afterAssemblyReload

, а также о ISerializationCallbackReceiver

Библиотекарь не унаследован от каких-либо классов Unity.

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

В настоящее время я храню ссылки загруженных активов в два списка, разделяя их на группы активов и активы

    //Loaded bundle
    [SerializeField]
    private List<AssetBundle> m_LoadedBundles;

    //Loaded assets from bundle
    [SerializeField]
    private List<StaticDataBase> m_LoadedAssets;

Во время инициализации библиотекаря я загружаю активы и добавляюссылка в список выглядит следующим образом:

    private void LoadAllAssets(AssetBundle bundleRef)
    {
        foreach( StaticDataBase obj in bundleRef.LoadAllAssets<StaticDataBase>())
        {
            UnityEngine.Assertions.Assert.IsFalse(m_LoadedAssets.Contains(obj), StackTraceUtility.ExtractStackTrace());
            m_LoadedAssets.Add(obj);
        }

    }

Я хотел бы сериализовать ссылку загруженных пакетов и ресурсов в памяти и иметь возможностьИспытайте их (если возможно, с помощью serial serialization / api) и сможете десериализовать, чтобы восстановить ссылку, и сможете элегантно обрабатывать загрузку / повторную инициализацию библиотекаря.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...