雑用担当の備忘録

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

2015年10月

ScaleForm フォント

これも Life is Strange を参照してくださいで終わってしまうのですが。

実はデフォルトで H7Components.lib.fonts_jp と H7Components.lib.gfxfontlib_jp も含まれてたりします。ただし日本語グリフが存在するフォントは DFP平成ゴシック体W7 のみです。

GfxUI.int を修正してこのフォントで表示されるようにした状態が
MMH702j
MMH703j

まぁ、Bold なんでくどいですよね。

Life is Strange の ScaleForm フォント作成を参照して頂きたいですが。
その通りに作成した 源真ゴシック 版は
MMH702j2
MMH703j2

こんな感じになります。

TODO:
一点、問題が残っています。
MMH704
上画像の様に Tips が表示されるんですが、この部分フォント置換で問題が出ます。
なんでだろう?
まぁ頭が閃かないので TODO

ムービーの字幕

Life is Strange と同じような感じでいけるので字幕のフォント作成を参照してください。
ですが、一点だけ注意

SubtitleFontName=JpFontsINT.DialogFont
[Engine.StartupPackages]
Package=JpFontsINT

JpFontsINT(パッケージ名は何でもいいです)の後の名前
DialogFont(これも名前は何でもよい)なんですが、この後に自動で _INT が付加されます。
従って、実際の名前は DialogFont_INT にしておかないと駄目です。

実装すると
MMH701j
日本語で表示されます

概要:
  • UE3
  • ローカライズデータは INT テキストでUTF-16LE
  • フォント UE3 + ScaleForm
何のことはない、Life Is Strange と同じような感じで出来ます。
MMH701j
MMH702j
MMH703j

概要:
  • Unity 4.6.7p2
  • ローカライズデータ resource.assets (index:5788, offset:0x13D94A8, type:-9)
  • フォント Dynamic,ファイルは未特定
ローカライズデータは UnityEx で抽出できますが txt ではありません。概要に書いている部分のデータが対象データになります。バイナリなんですが簡単に編集できます。
TMC01
この画像の一行目を日本語化してみます。
ONCE, で検索します。
TMC04
黒でハイライトされている部分が対象のデータです。
前後の部分を説明します。ピンクの部分

ONCE の前の 2F 00 00 00 が文字列(ONCE)の長さ
その前の 05 00 00 00 がローカライズの数(English, Frence, Italian, German, Spanish)
VO_INTRO_OPENING_11 が IndexKey
その前の 13 00 00 00 が IndexKey の長さ
黒ハイライトの後の 00 はアライメント調整のパディング

重要なのは文字列の長さ 2F 00 00 00 とパディングの 00
TMC05
見にくいですが緑の部分、文字列の長さが 0x4F なので 4F 00 00 00
文字列の終わりが 0x9D9A なのでパディングは 00 で良い。

以上の修正が終わったら UnityEx で assets に戻すと
TMC03
こんな感じで日本語で表示されます。

追記:
さらっと流してましたが文字コードは UTF-8 です。

ローカライズデータ

このゲームのローカライズデータは sharedassets1.assets の 80days.inkcontent にあります。
文字コードは UTF-8N で JSON 形式です。
この 80days.inkcontent には画面に表示される文字列以外に制御文も含まれます。
よくある紙芝居アドベンチャーゲームのスクリプトみたいなものです。
80days01
上画像の部分をローカライズします。80days.inkcontent に上記の文章が含まれている部分があるのでそこを日本語にします。文字コードは UTF-8N です。
80days02
入れ替えて同じ画面なんですが表示されません。
output_log を見てみると以下のエラーが出ています。

JsonReaderException: Unterminated string. Expected delimiter: ". Line 1, position 4960.
  at Newtonsoft.Json.JsonTextReader.ReadStringIntoBuffer (Char quote) [0x00000] in <filename unknown>:0
                                                     ・
                                                     ・
  at Newtonsoft.Json.JsonTextReader.ParseString (Char quote) [0x00000] in <filename unknown>:0
  at Inklewriter.Knot.StitchNamed (System.String stitchName) [0x00000] in <filename unknown>:0
  at Inklewriter.Knot.StitchWithPath (System.String path) [0x00000] in <filename unknown>:0
  at Inklewriter.Story.FindStitch (System.String stitchPath, System.String parentPath) [0x00000] in <filename unknown>:0
  at Inklewriter.StoryChunk.FindStitch (System.String stitchPath) [0x00000] in <filename unknown>:0

ライブラリの問題なのかJSONデータ側の問題なのかと思い、ローカライズした部分の JSON をライブラリでパースして見ます。正常に動作します。ライブラリでは無いので

  at Inklewriter.Knot.StitchNamed (System.String stitchName) [0x00000] in <filename unknown>:0

ここに注目して Inklewriter.Knot を調べます。Assembly-CSharp.dll をデコンパイルします。
public BaseStitch StitchNamed(string stitchName) を見ます。

    text = (obj as string);
    string[] array = text.Split(new char[] { ' ' });
    int index = Convert.ToInt32(array[0]);
    int count = Convert.ToInt32(array[1]);
    UTF8Encoding uTF8Encoding = new UTF8Encoding();
    string @string = uTF8Encoding.GetString(this.indexedContentText.bytes, index, count);
    object definition = Utils.JSON.ToObject(Utils.JSON.Deserialise(@string));

怪しいのはuTF8Encoding.GetString() ですね。ここで正常な JSON データを切り取っていないのでライブラリに渡した後でエラーになっているようです。ではこの index, count はどこで設定されているのかを見ます。
設定されているのは
private void CommonInit(Dictionary<string, object> knotDictionary, TextAsset indexedContentText)

    Dictionary<string, object> dictionary = knotDictionary["indexed-content"] as Dictionary<string, object>;
    this.indexedStitchRanges = (dictionary["ranges"] as Dictionary<string, object>);

ここです。注目すべきは "indexed-content", "ranges" です。この値を検索します。
sharedassets1.assets の 80days (これもJSON)に

"indexed-content":
{
    "filename":"80days.inkcontent",
    "ranges":
    {
        "storycrashed":"0 150",
        "repeat_visit_bank":"150 1294",
        "village_bank":"1444 97",
        "medium_bank":"1541 97",

このような部分があります。"0 150" のようにオフセットとサイズがここに指定してあります。
ローカライズによりここのオフセットとサイズがずれたため正常に JSON データが切り出せていなかったようです。
ここを修正すると
80days03
正常に表示されました。(相変わらず機械翻訳でひどい訳ですが)

結論:
翻訳データは 80days.inkcontent にあるんですがその修正だけでは駄目
80days のオフセットとサイズも修正する必要がある。

オフセットとサイズの修正は手作業ではかなりの量があるのでプログラム実装した方が良いでしょう。
80days.inkcontent の1行辺りの UTF-8 のバイト数を計算(サイズ)
サイズを足しこんでいくのがオフセットそれを 80days の JSON で indexed-content, range の部分を置き換える感じです。

↑このページのトップヘ