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