Unity 的存档文件格式是一种通用打包格式,可以存储任何类型的文件,类似于 .zip 文件。
此文件格式由 AssetBundle 使用。AssetBundle 存档文件是在构建过程的最后阶段创建的,例如 BuildPipeline.BuildAssetBundles。当加载 AssetBundle 时,它们会被挂载到 Unity 虚拟文件系统中,例如 AssetBundle.LoadFromFile。
当使用 BuildOptions.CompressWithLz4 构建播放器时,此文件格式也用于播放器内容。在这种情况下,播放器运行时会自动挂载存档。
本节介绍 Unity 提供的用于处理存档的底层 API。
ArchiveFileInterface API 可用于加载存档。它们被挂载到 Unity.Content.ContentNamespace 中。一旦 Unity 挂载了文件,您的应用程序就可以通过使用 Unity 虚拟文件系统的任何 Unity 系统来访问存档中的文件。使用 AsyncReadManager 直接访问虚拟文件系统。
以下示例说明如何使用 ContentBuildInterface.ArchiveAndCompress 函数创建存档,并使用 ArchiveFileInterface.MountAsync 函数挂载存档。此示例生成一个使用 LZ4 压缩一种存储数据的方法,可以减少其所需的存储空间。请参阅 纹理压缩、动画压缩、音频压缩、构建压缩。
请参阅 词汇表 并包含一个文本文件的存档。
using Unity.Collections.LowLevel.Unsafe;
using Unity.Content;
using Unity.IO.Archive;
using Unity.IO.LowLevel.Unsafe;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor.Build.Content;
#endif
public class SampleBehaviour : MonoBehaviour
{
#if UNITY_EDITOR
unsafe void CreateAndMountArchive()
{
// Create the Archive
ResourceFile[] rFiles = new ResourceFile[1];
ResourceFile rf = new ResourceFile();
rf.fileName = "Assets/file1.txt"; // Path of the existing file, to copy into the Archive
rf.fileAlias = "file1.txt"; // Path given to the file inside the Archive
rFiles[0] = rf;
string archivePath = System.IO.Path.Combine(Application.streamingAssetsPath, "myArchive");
ContentBuildInterface.ArchiveAndCompress(rFiles, archivePath, UnityEngine.BuildCompression.LZ4);
// Mount the Archive
var ns = ContentNamespace.GetOrCreateNamespace("MyNamespace123");
ArchiveHandle ahandle = ArchiveFileInterface.MountAsync(ns, archivePath, "a:");
ahandle.JobHandle.Complete();
string textFilePath = ahandle.GetMountPath() + "file1.txt"; // ns:/MyNamespace123/a:/file1.txt
ReadCommand cmd;
cmd.Size = 1024;
cmd.Buffer = UnsafeUtility.Malloc(cmd.Size, 4, Unity.Collections.Allocator.Temp);
cmd.Offset = 0;
NativeArray<ReadCommand> cmds = new NativeArray<ReadCommand>(1, Allocator.Persistent);
cmds[0] = cmd;
ReadHandle rHandle = AsyncReadManager.Read(textFilePath, (ReadCommand*)cmds.GetUnsafePtr(), 1);
rHandle.JobHandle.Complete();
// ...At this point cmd.Buffer contains contents from file1.txt (up to 1024 bytes)...
rHandle.Dispose();
UnsafeUtility.Free(cmd.Buffer, Unity.Collections.Allocator.Temp);
cmds.Dipose():
ahandle.Unmount().Complete();
}
#endif
}