[UE4] uasset以外のアセットにChunkIDを設定する(ue4.22以降)


# Chunkとは
ue4でアプリケーションをリリースする際にはゲームを構成するアセットをひとまとめにしたパックファイルにひとまとめにすることが多いのですが、
それを**複数に分割する**機能です。
まずはこちらのスライドをどうぞ！

[UE4のモバイル開発におけるコンテンツアップデートの話　- Chunk IDとの激闘編 -](https://www.slideshare.net/EpicGamesJapan/ue4-chunk-id)



スライドにあるようにモバイルでのアセットの分割ダウンロード向けに作られた機能ですが
モバイル以外のプラットフォームでもダウンロードコンテンツやゲームを始めるときのダウンロード待ち時間を最小限にするためにも使われます。
最近はPrimaryAssetLabelなどを活用して柔軟にChunkIdをコントロールできるようになりました。

# NonAssetファイルは？

UE4はほとんどのアセットをエンジン内でuassetに変換して利用します。
ただしミドルウェアが利用する一部のアセットや動画ファイルなどは変換せずにそのまま扱えます。
利用する際は特定フォルダ以下にアセットを集めてAdditional Non-asset Directory to Packageにパスを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/d30169e2-8aa0-8104-6b8c-c89e61cceb8a.png)

あとはPrimaryAssetLabelを配置して終わり！
とおもいきや、パッケージしてみるとすべてchunk0に配置される結果になってしまいます。

PrimaryAssetLabelがCook処理の最後にuassetの配置を管理するアセットレジストリと連携してファイルを振り分け、Non-assetファイルはCookが終わった後、必要なファイルだけを抽出するStaging処理の中でiniファイルを参照しながら配置されるためです。

ただでさえ動画ファイルやメディアファイルは大きいのでできればChunk側に分割して振り分けたいところなので、これは困ります。

# 対処法 (UE4.22以降)
UE4.22からひっそりとNon-Assetファイルも含めすべてのファイルに対するChunkIdを操作可能なPakFileRule.iniが追加されました。
これを記述することでChunkを操作することが可能です。

## 使い方
プロジェクトを新規作成したとき、デフォルトではConfigフォルダの中に
DefaultPakFileRule.iniは自動的には**作られません**。
まずこちらを新規作成するところから始めましょう。iniファイルは普通のテキストファイルです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/b55fff04-1e3e-7f8f-7484-7b14990e0adb.png)


##PakFileRule.iniファイルのフォーマット
Engine/Config/BasePakFileRules.iniに記述があります

```BasePakFileRules.ini
; These rules are applied in order, the first rule that applies per file is taken and no others are evaluated
; [SectionName]
; bOverrideChunkManifest=false 		; If true this allows overriding assignments from the cooker
; bExcludeFromPaks=false 			; If true this removes entirely, cannot coexist with overridepaks
; OverridePaks="pakchunk1" 			; If set this will override pak list, comma separated
; Platforms="iOS,Android"			; If set this rule will only apply to these platforms
; Targets="Shipping,Test"			; If set this rule will only apply to these configurations
; bOnlyChunkedBuilds=true			; If set this rule will only apply to chunked builds
; bOnlyNonChunkedBuilds=true		; If set this rule will only apply to non-chunked builds
; +Files=".../*FileMask*.*"			; List of file masks to apply to, using the C# FileFilter class
```

フィルタで指定したファイルのChunkを切り替えることや、フィルタで指定したファイルをPakから除外することができます。

## 記述例

```DefaultPakFileRules.ini
[Movies]
OverridePaks="pakchunk3"
bOverrideChunkManifest=true
+Files="*.mp4"

[NonAssetsInChunk1]
OverridePaks="pakchunk1"
bOverrideChunkManifest=true
+Files=".../NonAssets/Chunk1/..."

[OnlyMoviesInChunk2]
OverridePaks="pakchunk2"
bOverrideChunkManifest=true
+Files=".../NonAssets/Chunk2/.../*.mp4"

```

※2020/2/18 パスの記述を修正

## pakの内容物の確認
pakの確認には UnrealPakが便利です。含まれているファイルをリスティングしたい場合は `-List` オプションを使います。
以下が動作例です。Chunk1に指定したmp4ファイルが含まれていることがわかります。

```
> UE423\Engine\Binaries\Win64\UnrealPak.exe DestDir\WindowsNoEditor\ChunkPackage423\Content\Paks\pakchunk1-WindowsNoEditor.pak -List
LogPakFile: Display: Using command line for crypto configuration
LogPakFile: Display: Added 0 entries to add to pak file.
LogPakFile: Display: Mount point ../../../ChunkPackage423/Content/
LogPakFile: Display: "Maps/NewWorld.uexp" offset: 0, size: 250 bytes, sha1: 737C2BA2106A6D0A689280A4F0EAEFF31D42EFF4, compression: Zlib.
LogPakFile: Display: "Maps/NewWorld.umap" offset: 323, size: 1029 bytes, sha1: B43AE5295E60BAFE2B6B51C617B53275FA03BDF7, compression: Zlib.
LogPakFile: Display: "MyAsset/Chunk1/Chunk1.mp4" offset: 2048, size: 900034 bytes, sha1: CB8C9A02D7EA029BB08FE35898E0A60A28668F0D, compression: None.
LogPakFile: Display: 3 files (901313 bytes), (0 filtered bytes).
LogPakFile: Display: Unreal pak executed in 0.004506 seconds
```

## 関係するログなど
AutomationToolがStaging処理を行うため、`Engine\Programs\AutomationTool\Saved\Logs`フォルダなどにログが格納されています。

## 参考ソースファイル

- CopyBuildToStagingDirectory.Automation.cs
  - GetPakFileRules関数
  - ApplyPakFileRules関数
  - GetPakFileRules関数

もしうまく動作しない場合は上記ソースファイルを覗いてみて、
コメントアウトされているLogInformation行からコメントを取り外したりすると追加の情報が得られます！

```
Cleaning Stage Directory: D:\dev\ue424Projects\Package424\Saved\StagedBuilds\WindowsNoEditor
Creating pak using streaming install manifests.
Adding to PakFileRules for Section NonAssetsInChunk1 : .../Chunk/Chunk1/.../*.mp4  <----DefaultPakFileRules.iniからセクションが追加された
Adding to PakFileRules for Section NonAssetsInChunk2 : .../Chunk/Chunk2/.../*.mp4  <----DefaultPakFileRules.iniからセクションが追加された
Setting pak assignment for file D:\dev\ue424Projects\Package424\Content\Chunk\Chunk1\Chunk1.mp4 to pakchunk1  <----ChunkIDが適用された
Setting pak assignment for file D:\dev\ue424Projects\Package424\Content\Chunk\Chunk2\Chunk2.mp4 to pakchunk2  <----ChunkIDが適用された
Creating Pak files utilizing 12 cores
Executing 3 UnrealPak commands...
Waiting for child processes to complete (3/3)
```