雑用担当の備忘録

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

2015年10月

概要:
  • Unity 5.1.3p3
  • 翻訳データ sharedassets1.assets の 80days.inkcontent
  • フォント Dynamic,フォントファイルは特定していません。
今回はローカライズデータに注目します。

UE にはエンジン自体にローカライズ機能があるんですが Unity にはエンジンとしてローカライズ機能は実装していません。したがって各ベンダー毎にローカライズ機能を実装するわけなんですが、そのあたりのことが今回の題材に関係します。

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 というツールがあるのでそれを使えば良い。

概要:
  • Unity 5.1.1f1
  • 翻訳データ resources.assets の loca_ge (loca_ge.1) テキストで UTF-8N
  • Dynamic なので置き換えしなくても日本語表示。置換する場合はフォント 複数ありますが一部 sharedassets1.assets の VERDANA

loca_ge 編集した状態(機械翻訳がひどいですが)
LH204
フォント置換
LH203

Scaleform フォント

ムービー字幕以外のフォントの話です。
Life is Strange には4つのフォントがあります。
  1. オブジェクト,日記等の手書き風文字
  2. 画面下部に表示される台詞 イタリック
  3. 画面下部に表示される台詞
  4. ポスター,SMS等
これらが swf という形で upk に格納されています。

ここからの情報はアドレスは忘れましたが YouTube にあった UE3+Scaleform の英語情報からです。

作成手順: fla ⇒ swf ⇒ upk
ま ず fla (フラッシュ) を作成します。自分が持っているのは Adobe Flash Professional CS6 なんでこれに UDK-2012-01\Development\Flash の下にあるエクステンションを組み込みます。これが Scaleform です。
フラッシュを作ります。
LIS10
上画像の様にテキストを4作成します。各テキストのプロパティでフォントを指定します。
SN_Font_JA.upk では
  • Normal Font (ふい字P)
  • Italic Font (源柔ゴシックP Italic)
  • Dialogue Font (源柔ゴシックP Regular)
  • Roboto Font (源真ゴシックP)
と設定しています。源柔ゴシックP Italic については後で解説します。
この状態で UDK-2012-01\UDKGame\Flash\SN_Font_JA フォルダに fonts_ja.fla という名前でセーブします。

次に swf 生成するのですが画面左上にある Scaleform Launcher の Test with: GFxMediaPlayer ボタンを押下します。パブリッシュ処理が開始されます。この時にフォントデータが埋め込まれます。
これで fonts_ja.swf が生成されるのでこれを upk 化します。

UDK を起動してコンテンツブラウザから右クリック インポート で生成した UDK-2012-01\UDKGame\Flash\SN_Font_JA\fonts_ja.swf を指定してインポートします。
fonts_ja をセーブすると SN_Font_JA.upk が生成されています。

この SN_Font_JA.upk を Life is Strange が読み込むようにするには
LifeIsStrangeEngine.ini の [Engine.StartupPackages] セクションに Package=SN_Font_JA を追加する。
Life is Strange はこの指定をしなくても読み込まれるようです。

GFxUI.int にある [FontLib] [Fonts] セクションを書き換えるのですが日本語で起動するときは GFxUI.JPN があればそちらを読むので GFxUI.JPN を作成し
[FontLib]
FontLib=SN_Font_JA.fonts_ja

[Fonts]
NormalFont=HuiFontP
ItalicFont=Gen Jyuu Gothic P Italic
DialogueFont=Gen Jyuu Gothic P Regular
RobotoFont=Gen Shin Gothic P Regular

とすると良い。

ItalicFont について、自分の環境によるのかもしれませんがうまくいかなかったため
源柔ゴシックP を FontForge を使ってグリフを回転させたものを 源柔ゴシックP Italic として生成したものを使用する形にしています。

ムービー時の字幕フォント

Life is Strange のフォントは大きく2種類、通常時のフォント,ムービー中の字幕フォントがあります。
今回取り扱うのはムービー中のフォントで主に作成方法になります。

フォント作成には UE3 が必要で、UDK-2012-02 からは Life is Strange 起動時に読み込みエラーとなりますのでこれより古いバージョンが必要になります。この記事では UDK-2012-01 を使います。

起動してコンテンツブラウザで右クリック、新規フォント

パッケージ: JpFonts
名前: DialogFont ←これだと日本語表示されなくなりました。必ず違う名前にしてください。JpFonts では DialogFntJP にしています。
フォントを選択を押してフォントとサイズを選ぶ。今回は源柔ゴシックP、サイズ24
UnicodeRange:0x0020-0x00FF,0x0370-0x04FF,0x2000-0x206F,0x2100-0x214F,0x2190-0x23FF,0x2500-0x257F,0x25A0-0x26FF,0x3000-0x30FF,0x4E00-0x9FCF,0xFF00-0xFFEF
Texture Page width:1024
Texture Page Max Height:1024
XPadding: 2
YPadding: 2

Unicode Range はこんなに細かく指定しなくてもいいと思うんですが、最初作成したときに調べた日本語の範囲がこれだったので JpFonts.upk ではこの範囲指定になっています。もっと大きなレンジでいいかも。

注意してほしいのは Create Printable Only というオプションがあるのですが、これはチェックしないでください。デフォルトでは外れてますのでそのままに。ここをチェックすると温度の ℃ が出力されません。
この状態でセーブすると JpFonts.upk が生成されています。

デフォルトは YPadding:1 なんですがこれだとクリッピングミスが起きるので画面上にゴミが表示されます。したがって YPadding:2 以上にしてください。XPadding は念のため 2 にしています。

この JpFonts.upk を Life is Strange に読み込ませるわけですが
ここからの情報はこちらのサイトの情報を元にしています。情報有難うございます。

LifeIsStrangeEngine.ini の [Engine.StartupPackages] が upk の読み込み設定なのでここに Package=JpFonts を追加。 ←この設定は必要ありません。
[Engine.Engine] セクションの SubtitleFontName=JpFonts.DialogFntJP とすることで設定は完了する。

注意すべきは名前で設定した DialogFont で、Life is Strange の字幕データ *_INT.txt の中身
42 2304 DialogFont In the previous episode of "Life Is Strange"...

こんな感じですが DialogFont とこのファイルにフォント名の指定があります。
この指定はかなりの数あるのでこの DialogFont に名前を合わせる方が早いです。

DialogFont では駄目です。
従って翻訳データも
42 2304 DialogFntJP In the previous episode of "Life Is Strange"...
のように変更する必要があります。

↑このページのトップヘ