UnrealPak 명령어, Chunk와 Pak파일
Chunk
Chunk는 독립적으로 배포가 가능하고 다운로드를 가능하게 하는 에셋 묶음이다.
Chunk0은 기본 프로젝트 콘텐츠, 무조건적으로 프로젝트당 하나 있게 되고
언리얼 에디터에서 DataAsset 타입으로 PrimaryAssetLabel 파일을 추가해서
Chunk1..2..3..?? 해당 디렉터리에 있는 파일을 다운로드 가능하게 묶는 것이 청크 세팅이다.
PakFile
Unreal Automation Tool로 패키징 시 청크가 세팅된 대로 CDN을 위한 Pak 파일을 생성하는 과정이 이뤄진다.
.Zip 파일 압축파일처럼 여러 개의 리소스를 압축해 놓은 것이다. 내부 구조는 아래 링크에서 굉장히 잘 설명해 준다.
https://zhuanlan.zhihu.com/p/54531649
Pak 내부에는 리소스 내용 구간, 파일 인덱스 내용 구간, pak 파일 정보 내용 구간 3가지 구간으로 나뉜다.
(구간이라고 말하는 것은 순차적으로 직렬 저장되기 때문)
리소스 내용 구간
Pak 파일의 시작 부분에 위치하고 각 파일의 FPakEntry와 실제 파일 내용을 차례로 저장한다.
FPakEntry는 한 pak안에 수많은 리소스 중 한 개의 리소스이다. 리소스 크기와 pak 파일 안에 어디 있는지 알기 위한 offset이 있다
파일 인덱스 내용 구간
CDN을 받을 때 올바른 경로에 넣어주는 것 (마운트)을 하려면, Pak 파일 안에 수많은 리소스에 대한 경로..?
모든 리소스 파일들은 Files에 저장되는데 각자마다 인덱스가 있다. 인덱스는 FPakDirectory 경로와 매핑돼있다. 또
각 리소스 파일 이름과 인덱스 번호도 매핑된다.
엔진소스에서 UnrealPak.exe의 작동 방식을 확인 가능하다. 다 직렬화해서 저장하는 모습..
pak 파일 정보 내용
파일 마지막에 해당 내용이 있다. pak 파일의 마지막 위치( 45 바이트 로 고정)에 기록된다고 한다.
IndexOffset ( Pak 파일 인덱스 정보 영역의 시작 위치 ),
IndexSize ( 8바이트, Pak 파일 인덱스 정보 영역의 크기 ) ,
IndexHash ( 20바이트, 파일 인덱스 정보의 SHA1 값 )
UnrealPak.exe
엔진경로\Engine\Binaries\Win64\UnrealPak.exe
해당 경로에서 Pak파일을 생성하고 조회하고 압축해제 해주는 실행파일을 찾을 수 있다.
명령어는 아래와 같이 확인해 볼 수 있다.
UnrealPak <PakFilename> -Test
UnrealPak <PakFilename> -List [-ExcludeDeleted]
UnrealPak <PakFilename> <GameUProjectName> <GameFolderName> -ExportDependencies=<OutputFileBase> -NoAssetRegistryCache -ForceDependsGathering
UnrealPak <PakFilename> -Extract <ExtractDir> [-Filter=<filename>]
UnrealPak <PakFilename> -Create=<ResponseFile> [Options]
일반적으로 위 명령어 대로 하면 되지만 Pak에 암호화가 걸려있을 때는 -CryptoKeys 명령어를 붙여줘야 한다. 그리고
프로젝트에서 암호화 설정 시 자동으로 생성된 Crypto.Json의 파일 경로를 입력해줘야 한다.
배치 파일 조회 예시
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Choi Jiwon
:: Pak 파일 정보 조회
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
SET EnginePath="{엔진경로}"
SET PakPath="%~dp0{Pak 파일 경로}"
SET CryptoFilePath="%~dp0Crypto.json"
%EnginePath%\Engine\Binaries\Win64\UnrealPak.exe %PakPath% -Info -CryptoKeys=%CryptoFilePath%
배치 파일 압축해제 예시
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Choi Jiwon
:: Pak 파일 압축 해제
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
SET EnginePath="{엔진경로}"
SET PakPath="%~dp0{팩 파일 경로}"
SET CryptoFilePath="%~dp0Crypto.json"
@echo "Extract Folder Created"
if exist %PakPath%_extracted (
rmdir /s /q %PakPath%_extract
)
%EnginePath%\Engine\Binaries\Win64\UnrealPak.exe %PakPath% -Extract %PakPath%_extracted -CryptoKeys=%CryptoFilePath%