Unity 아카이브 파일 포맷은 .zip 파일과 유사하게 모든 유형의 파일을 저장할 수 있는 일반적인 패키징 포맷입니다.
이 파일 포맷은 에셋 번들에서 사용됩니다. 에셋 번들 아카이브 파일은 빌드 프로세스의 마지막 단계로 생성됩니다(예: BuildPipeline.BuildAssetBundles). 에셋 번들이 로드될 때 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
}