雑用担当の備忘録

技術的な話のみになります。翻訳データそのものはありません。 カテゴリ>その他>注意事項を必ず参照してください

アンパック

解析

const COMPRESS_NONE:i32 = 0;
const COMPRESS_ZLIB:i32 = 1;
const COMPRESS_GZIP:i32 = 2;

struct PakEntry {
    file_name: FString,
    offset: u64,
    size: u64,
    uncompressed_size: u64,
    compression_method: i32,
    hash: [u8; 20],
    compression_blocks: Vec<PakCompressedBlock>,
    bencrypted: u8,
    compression_block_size: u32,
}

struct PakCompressedBlock {
    compressed_start: u64,
    compressed_end: u64,
}

entry[0]

2A 00 00 00
45 6E 67 69 6E 65 2F 50 6C 75 67 69 6E 73 2F 32
44 2F 50 61 70 65 72 32 44 2F 50 61 70 65 72 32
44 2E 75 70 6C 75 67 69 6E 00
FileName = "Engine/Plugins/2D/Paper2D/Paper2D.uplugin"

00 00 00 00 00 00 00 00
Offset = 0x0

7E 01 00 00 00 00 00 00
Size = 0x17E

72 03 00 00 00 00 00 00
UncompressedSize = 0x372

01 00 00 00
CompressionMethod = 0x1 (COMPRESS_ZLIB)

D3 1C F0 F0 1B 02 64 78 9C B5 D6 B8 35 45 82 86 CE 4E 38 D4
Hash

01 00 00 00
TArray.ArrayNum = 1
49 00 00 00 00 00 00 00
PakCompressedBlock.CompressedStart = 0x49
C7 01 00 00 00 00 00 00
PakCompressedBlock.CompressedEnd = 0x1C7

00
bEncrypted=0x0

72 03 00 00
CompressionBlockSize=0x372

まず CompressionMethod をみると 0x1 これは COMPRESS_ZLIB なので ZLIB 圧縮されている。
シー ク CompressedStart から CompressedEnd - CompressedStart これがサイズになるのでこの分読み込む。読み込んだものを ZLIB で復元しファイルに出力する。これを ArrayNum 分繰り返す。出力ファイルは FileName

以上でアンパックできます。

このフォーマットを見る限り pak は
bEncrypted = 0x0 (false) つまり非暗号で圧縮無し・ZLIB圧縮・GZIP圧縮
bEncrypted = 0x1 (true) 暗号化されている(AES)で圧縮無し・ZLIB圧縮・GZIP圧縮
のパターンが出てくるかもしれません。
(UE4.9.1時の情報)
AES暗号済みのも出現しました。

概要
  • UE4
  • データは locres
  • pak は zlib compress リパック必要なし
  • Font は EFontCacheType::Runtime
  • uasset はカスタマイズヘッダー
locres は標準形なので TVECR を参考にすると良い。
今回取り扱うのは zlib compress とフォントの uasset カスタマイズヘッダー対応について。

アンパックしてlocresを編集した状態
良さそうに見えますが CJK 互換では問題が出るかも
KholatEN
上記に uasset へ日本語フォントを組み込んだ状態
KholatJP

フォント

今までの情報で豆腐では無く日本語が表示されているはずですが(1)にも書いたようにCJK互換で中国のグリフが表示されたり文字の上部が若干欠ける不具合があります。
対処方法はフォント置換なんですがやり方は2通りあります。
  1. Slate の ttf ファイルを置き換える。
  2. uasset のフォントデータを置き換える。
1は簡単なんですがこのゲームでは文字の上部は欠けたままです。そんなに気にならないとは思うので気にしないという人は1で良いと思います。
2はUE4自体が必要ですが文字の上部も欠けずにちゃんと表示されます。

Slate 置換
対象ファイル Engine\Content\Slate\Fonts\DroidSansFallback.ttf
を日本語フォントに置き換えるだけファイル名はそのまま DroidSansFallback.ttf にする。
この情報はこちらのスレの130さんからの情報です。有難うございます。

uasset 置換
対象ファイル EthanCarter\Content\Gameplay\Assets\Fonts\MenuFonts.uasset
UE4でこのファイルを作成していきます。UE4のバージョンは4.8.3を使うとうまくいきます。
まず MenuFonts.uasset の中身をバイナリエディタで見ます。
/Game/Gameplay/Assets/Fonts/MenuFonts
こんな部分があると思います。これを元にUE4で作成していきます。
UE4起動して
UE4_Font01
このようなフォルダ構成にして ユーザインタフェース>フォント で MenuFonts を作成する。
UE4_Font02
フォントを追加でインポートする ttf ファイルを選択する。この状態で保存

後はパッケージングするだけなんですが、パッケージ設定で Packaging:Use Pak File のチェックを外して pak ファイルにまとめないようにするとアンパックの手間がいらないので良いです。

後は出来た MenuFonts.uasset ファイルを元の EthanCarter\Content\Gameplay\Assets\Fonts\MenuFonts.uasset と置き換える。

このゲームはヘッダにカスタマイズ等無いようなので、置き換えるだけでゲーム起動します。

↑このページのトップヘ