assets 解析

Unity は assets というファイルにパッケージされています。
今回の対象は Unity5 です。

struct Assets {
    header_size: u32,       // BigEndian
    full_size: u32,              // BigEndian
    version: u32,               // BigEndian
    base_offset: u32,        // BigEndian
    zero_guess: u32,
    version_string: String,    // Null 終端
    num0: u32,
    zero: u8,
    base_count: u32,
    bases: Vec<Base>,
    entry_count: u32,
    num1: Vec<u8>,    // padding
    entries: Vec<Entry>
}
struct Base {
    num0: i32,
    array: Vec<u8>,      // num0 が負 size 0x20,num0 が正 size 0x10
}
struct Entry {
    index: u32,
    zero: u32,
    offset: u32,        // include filename size.
    size: u32,          // include filename size.
    type: u32,
    xtype: u16,
    num0: i16,
    zero: u32,
}
BigEndian と LittleEndian が混在していますので注意

翻訳データの loca_ge をエクスポートする処理を考える。
上記のヘッダを読み込んだ時点で
assets.base_offset = 0x19890

entries[578] (loca_ge の entry)
index = 579, offset = 0x17C15E78, size = 0x31638
が判明している

base_offset + offset = 0x17C2F708

entry.offset の先には
struct FileName {
    filename_length: u32,
    filename: Vec
}
テキストデータの先頭には data_size: u32 が付加されている。

17C2F708: 07 00 00 00 6C 6F 63 61 5F 67 65 00 DA 15 03 00
filename_length = 7, filename = "loca_ge", data_size = 0x315DA

filename は Null 終端では無い。filename の後の 0x00 はパディングなので注意。可変長
この後に実際のデータがあるので filename で data_size 分出力すれば良い。

フォントデータは ヘッダー, data_size, ttf, フッターとなっているので ttf の部分だけ抜きだせば良い。

この辺りの処理は UnityEx というツールがあるのでそれを使えば良い。