Мы создаем приложение Hololens, которое будет использовать пакеты ресурсов из папок устройства, но мы получаем ошибку «Невозможно открыть файл архива» при попытке загрузить файлы пакетов.
Поскольку у нас нет большого опыта работы с пакетами ресурсов, мы начали с создания очень простого файла пакета (всего несколько примитивов и материалов Unity) и предприняли первую попытку загрузить их в приложение из редактора Unity. Это работает, как и ожидалось, но происходит сбой, когда мы развертываем приложение в нашей Hololens.
Это наш метод загрузки:
#if WINDOWS_UWP
public async void CallForBundles()
#else
public void CallForBundles()
#endif
{
string bundleFile = "--- NO BUNDLE ---";
#if UNITY_EDITOR
bundleFile = @"D:\temp\UnityBuilds\AssetBundles\exportablebundle";
#endif
#if WINDOWS_UWP
Windows.Storage.StorageFolder objectsFolder = Windows.Storage.KnownFolders.Objects3D;
Windows.Storage.StorageFile bundleFilePointer = await objectsFolder.GetFileAsync("exportablebundle");
bundleFile = bundleFilePointer.Path;
#endif
var myLoadedAB = AssetBundle.LoadFromFile(bundleFile);
//instante bundle components from myLoadedAB//
}
Как видите, это очень просто. Находим путь бандла разными методами в зависимости от платформы (мы уже использовали эту систему для текстовых файлов, png и прочего) и работает сторона UNITY_EDITOR. WINDOWS_UWP выдает эту ошибку только при вызове AssetBundle.LoadFromFile(bundleFile);:
Unable to open archive file: C:/Data/Users/edata/3D Objects/exportablebundle
(Filename: C:\buildslave\unity\build\Runtime/VirtualFileSystem/ArchiveFileSystem/ArchiveStorageReader.cpp Line: 542)
'Holoplan.exe' (CoreCLR: CoreCLR_UWP_Domain): Loaded 'C:\Data\Users\DefaultAccount\AppData\Local\DevelopmentFiles\HoloplanVS.Release_x86.jalfonso\System.Diagnostics.StackTrace.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
NullReferenceException: Object reference not set to an instance of an object.
at GameManager.<CallForBundles>d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.<ThrowAsync>b__6_0(Object state)
at UnityEngine.UnitySynchronizationContext.WorkRequest.Invoke()
at UnityEngine.UnitySynchronizationContext.Exec()
at UnityEngine.UnitySynchronizationContext.ExecuteTasks()
at UnityEngine.UnitySynchronizationContext.$Invoke1(Int64 instance, Int64* args)
at UnityEngine.Internal.$MethodUtility.InvokeMethod(Int64 instance, Int64* args, IntPtr method)
(Filename: <Unknown> Line: 0)
"Unable to open archive file: C:/Data/Users/edata/3D Objects/exportablebundle"
похоже, это та же ошибка, которая возникает, когда приложение пытается загрузить пакет с неправильным именем файла или путем, даже при работе в редакторе, поэтому похоже, что по какой-то причине «AssetBundle.LoadFromFile» не может найти файл. Мы проверили файл bundleFile в этой строке, и он содержит правильный путь к файлу («C:\Data\Users\edata\3D Objects\exportablebundle», где «exportablebundle» — имя файла пакета), поэтому мы предполагаем, что «AssetBundle.LoadFromFile» имеет проблемы при чтении из локальной папки Hololens, но у нас нет особых идей о том, как решить эту проблему.
¿Кто-нибудь может помочь нам, пожалуйста?
РЕДАКТИРОВАТЬ-
Мы создаем наш пакет ресурсов с образцом кода из руководства Unity в разделе «Рабочий процесс набора ресурсов». Вот так:
static void BuildAllAssetBundles(){
string assetBundleDirectory = "Assets/AssetBundles";
if (!Directory.Exists(assetBundleDirectory)){
Directory.CreateDirectory(assetBundleDirectory);
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
}
«StandaloneWindows» в качестве цели сборки кажется наиболее близкой к hololens из доступного списка, поэтому мы пошли на это.
Совместим ли пакет активов с UWP? Я не уверен, но вам может понадобиться правильное окончание файла? Как создавался бандл?
@derHugo найдите разъяснение в исходном сообщении под заголовком «EDIT».
К сожалению, в настоящее время объединение ресурсов не работает на устройствах HL. Это известная проблема, которая должна быть исправлена.
Попробуйте использовать обратную косую черту в пути.