版本:Unity 6 (6000.0)
语言:English
删除本地资源包
资源加载分析器模块

存档

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
}
删除本地资源包
资源加载分析器模块