2018年5月13日日曜日

Pillars of Eternity 2 で日本語が表示できない・・・

2018/05/09 に Pillars of Eternity 2 (PoE2) リリースされ、早速日本語化の作業に入ろうとしたところ、日本語が表示できません。

中国語フォントを使用し表示を試みたが、ひらがながでない!

前作や Tyranny では簡単に日本語化できたのですが、文字の表示の仕組みが変わってしまったのでしょうか?

では、試行錯誤を開始!


この記事は、Pillars of Eternity 2 で日本語を表示する方法を模索する過程をダラダラと書き綴ったものです。自分用のメモ書きとして、調べたことを纏めていきます。



■はじめに


今回解析する Pillars of Eternity II: Deadfire は Obsidian Entertainment 開発の CRPG で、Pillars of Eternity シリーズの二作目です。


前作の Pillars of Eternity (PoE1)や 同じゲームエンジンを使用した Tyranny の日本語化MODはファックマンさんのサイトで公開されています。興味のある方は是非このゲームにチャレンジしてみて下さい。

「ディスオナード日本語化計画 | uploader.jp」
https://ux.getuploader.com/fackman/


■ゲームエンジン


最近の Obsidian 製 CRPG で使用されているゲームエンジンは Unity です。
各ゲームで使用しているUnityのバージョン
  • Pillars of Eternity (Unity 4.7.0f1)
  • Tyranny (Unity 5.4.4p4)
  • Pillars of Eternity II: Deadfire (Unity 5.6.3p3)

Unity の場合、(ゲーム名)_Data フォルダー内にある output_log.txt でバージョンを確認することができます。ちなみに、PoE2 で使用している Unity 5.6.x は Unity 5シリーズの最終バージョンだそうです。



■解析ツール


まずは、ゲームの解析に必要なツールを揃えます。ここでは Unity のアセットファイルを解析するのに便利なツールを用意します。

1.Unity Assets Explorer v 1.5

「Unity Assets Explorer [v 1.3] - ZenHAX」
http://zenhax.com/viewtopic.php?t=36
これは、いつも使用している、Unity のアセットファイル(resources.assets)の中を見たり、指定した項目のインポートやエクスポートができるツールです。 今日現在(2018/05/12)、上記のリンクからはリンク切れでダウンロードできなくなっていました。

2.UnityEX v1.7.2

「UnityEX - Вскрытие игровых ресурсов - Zone of Games Forum」
http://forum.zoneofgames.ru/topic/36240-unityex/
これも、同じようなツールです。ロシア語のサイトなので Google 翻訳などを駆使して調べてから使用します。特徴は GUI とコマンドライン両方のインターフェースをサポートしていることです。コマンドラインをサポートしているので、PoE1 や Tyranny のフォント置き換え用バッチファイルで使用しています。

3.Unity Asset Editor Version 0.2

「[Tools] Unity Asset Editor (Zip) - inXile Forums」
https://forums.inxile-entertainment.com/viewtopic.php?t=8060
私は暫くの間 UAE_0_3(BETA_1) を使用していましたが、こちらも2015年以降開発が止まっています。 このツールはアセットの内容を簡単に覗くことができたので重宝していたのですが、最近の Unity 製ゲームの解析には使えない状態です。

4.AssetBundleExtractor (UABE) v2.2

「[TOOLS] Unity Assets Bundle Extractor」
https://7daystodie.com/forums/showthread.php?22675-Unity-Assets-Bundle-Extractor
これは 7 Day to Die でMODを作成する時に使用されているツールらしいですが、このゲーム以外の解析にも重宝します。 今現在(2018/05/12)も開発が継続しており、新しいゲームの解析に使用できる可能性が高いツールと言えます。

5.AssetStudio 0.10.0.0

「Perfare/AssetStudio: AssetStudio is a tool for exploring, extracting and exporting assets and assetbundles.」
https://github.com/Perfare/AssetStudio
これは、今回の調査の過程で見つけたツールで、オープンソースのツールです。私は2018/05/11時点のリポジトリーからビルドして使っています。このツールは Mesh やTexture を画像としてすぐに見られるのが特徴です。また、"*.unity3d" ファイルも読み込めるので解析に便利です。ただし、項目のエクスポートはできますがインポートはできませんので、解析に特化したツールと言えます。ソースコードが公開されてますので自分で改造することも可能です。

6.BMFont

「BMFont - AngelCode.com」
http://www.angelcode.com/products/bmfont/
これは TrueType フォントからビットマップフォントを作成するツールです。このツールは指定したフォントから指定した文字の画像ファイルと座標情報ファイルを作成してくれます。今回、必要かどうかはわかりませんが、何時でも使えるように準備だけはしておきます。

7.バイナリエディタ Bz

「Bz - c.mos」
http://www.vcraft.jp/soft/bz.html
オリジナルの作者のバージョン。
最終バージョンは Version 1.62
特徴は巨大なファイルも一瞬で開くことができるので、非常に便利です。また、安定性も抜群です。
「devil-tamachan/binaryeditorbz: Automatically exported from code.google.com/p/binaryeditorbz」
https://github.com/devil-tamachan/binaryeditorbz
こちらは、オリジナルの作者から引き継いでオープンソース化したものです。
最新バージョンは Version 1.9.8.5。
オリジナルからの大きな変更点としては64ビット化により4GB以上のファイルに対応したことでしょうか。ただし、私の環境ではカーソル表示のバグが有り、このバグの発生しない古い Version 1.8.4(32bit版) を使用しています。必要に応じオリジナル版も使用しています。



ところで、なぜ同じようなツールを沢山用意するかと言いますと、ゲームによってアセットが上手く見れないことがあったり、見え方が異なったりします。わからない時は色々なツールで中身を確認し、解決策を探っていくことになります。


■翻訳対象テキスト


このゲームではローカライズ関連のファイルが exported フォルダーに纏まっており、さらにファイルの種類ごとにフォルダーが分かれています。

1.フォルダー構成


PillarsOfEternityII_Data
   ├─exported
       ├─design    …………… 付加情報
       │  ├─chatter
       │  ├─conversations
       │  └─quests
       └─localized …………… 言語情報
           ├─de
           ├─en
           │  └─text
           │      ├─chatter
           │      ├─conversations
           │      ├─game
           │      └─quests
           ├─fr
           ├─it
           ├─jp
           └─zh


2.ファイルの種類


2-1.言語情報


言語情報は (ゲーム名_Data)\exported\localized\(国) フォルダーにあります。
これは国ごとの会話、システム関連、クエスト関連やチャッターなどのテキストが記載されています。テキストの形式はXMLです。日本語化MODではこのテキストを翻訳することで日本語化を実現しています。ファイルはXMLファイルなのでメモ帳で開いて翻訳するだけで日本語化が可能ですが、実際はExcelシートに落とし込んで次に説明する付加情報を付け加えた形で翻訳者の方にお渡ししています。


2-2.付加情報


付加情報は会話情報、クエスト情報やチャッター情報に別れています。以前のバージョンでは付加情報はXML形式で記載されていましたが、PoE2 では JSON 形式に変更されました。記載されている内容自体はほとんど変更がないようですが、日本語化MOD作成ツールや会話ツリー表示ツールは変更する必要があります。


・会話情報

これは誰が誰に話しているか、会話の流れや分岐の情報が記載されています。NPCの名前がわかるので性別も判断しやすく、口調を統一するなど翻訳をスムーズ進める上で非常に重要な情報と言えます。ちなみにTyrannyでは会話ツリー表示ツールでこの情報を利用しています。

・クエスト情報

クエストの進行状況によるクエストの分岐情報などが記載されています。

・チャッター情報

これはPoE2から追加された情報で、まだ詳細を掴んでいませんがおそらくNPC間での雑談のようなものだと思っています。


■フォント


日本語を表示させるためには日本語フォントが必要になります。ゲームの場合は通常のアプリとは異なり、文字を以下のような画像(フォントテクスチャ)として保有し、必要な文字をこの中から切り出して描画しているようです。おそらく、フォントテクスチャの方が文字にエフェクトをかけたり、3Dでグリグリ動かしたりするのが楽なのだと思います。

Endless Space の英語のフォントテクスチャ

しかし、文字をフォントテクスチャとして保有しているため、表示したい文字がフォントテクスチャのどの部分(座標)にあるのかがわかりません。このため、座標情報をどこかに保有しておく必要があります。一言で言えば、フォントテクスチャと座標情報がペアで必要ということです。

以下のサンプルは、上記の Endless Space 英語版のフォントテクスチャに対応した座標情報ファイルの一部分です。各文字ごとに座標の情報が記載されているのがわかります。例えば 「char id=35」これは "#" で、x座標が 261 y座標が229、幅と高さが、24x28 とわかります。


1.Unityでのフォントの扱い


Unity ではゲーム内で使用するフォントなどはアセットファイル(resources.assets) に格納されていることが多いです。ゲーム内のファイルを一通り眺めて、フォント関連のファイルが見つからなかった場合は、アセットファイルを調査します。

Unity はテキストの表示方法がいくつかあるようです。私はUnityをほとんど触ったことがないので、他の日本語化プロジェクトから入手した情報などを元に区分けしてみました。
参考:「フォント - Unity マニュアル」
https://docs.unity3d.com/ja/560/Manual/class-Font.html


1-1.何もしなくても日本語が表示できるケース


私が日本語化にチャレンジしたゲームのほとんどは、このケースです。このケースではテキストを日本語化するだけで日本語が表示できるので、注意することはほとんどありません。文字コードに注意するくらいです。

今回改めて調べてみたところ、Unity の Dynamic font という機能を使用しているようです。これはゲーム起動時などにアセットファイルに予め登録しておいたTrueTypeフォントからフォントテクスチャを自動的に生成する機能です。また、フォントにない文字を表示しようとした場合は、パソコンにインストールされているフォントから文字を自動生成してくれます。これで英文フォントしか登録されていないゲームでも日本語が表示できます。

なお、Dynamic font の場合は座標情報は Unity がTrueTypeフォントからフォントテクスチャ作成する際に自動的に生成していると考えられます。

PoE1、Tyranny や Wasteland 2 などがこれに該当します。


1-2.TrueTypeフォントを差し替えて日本語を表示するケース


これは前項1-1と同じですが、予め登録されている英語版などのTrueTypeフォントを日本語フォントに置き換えることにより、任意のフォントの文字を表示できるようにするものです。座標情報についても同じですので別途用意する必要はありません。

PoE1、Tyranny はこの差し替えを行うことでフォントを変更しています。


1-3.文字をフォントテクスチャとして保有しているケース


これはTrueTypeフォントは使用せずに、予めフォントを画像化したものをフォントテクスチャとしてアセットに登録しているケースです(上記フォントの項目で示した画像を参照)。アセットの Type は Texture2D です。この場合は何らかの方法でフォントテクスチャを作成する必要があります。

フォントテクスチャを作成するためのツールとしては、ビットマップフォント作成ツール「BMFont」が有名です。このツールを使用するとTrueTypeフォントからフォントテクスチャと座標情報を作成することができます。Unityではありませんが、Baldur's Gate: Enhanced Edition の前バージョン(V2系)用の日本語フォント作成時にこのツールを使用しました。

Unity のゲームでは Endless Legend や Endless Space がこれに該当します。詳しくありませんが Endless Legend では座標情報が何処にあるのかがわからないようで、今のところ日本語化は存在しないようです (v1.6.2から日本語の表示が可能になりました)。一方、Endless Space はTextAssetとして座標情報がアセットに登録されているので、フォントテクスチャと座標情報を差し替えることにより日本語を実現しているようです。


1-4.TextMesh Proを使用するケース


これは先程調査している最中に見つけたばかりの形式で、まだ何も理解していません。なんか格好良い文字表現が可能な仕組み?みたいです。


2.PoE2のフォントはどこだ?


やっと、本題に入ります。一応、ゲームフォルダー配下にあるファイルは一通り眺め、フォント関連のフォルダーやファイルが無いことを確認しました。これはファイル名や拡張子から推測しましたが、中身まではまだ確認していません。

次にアセットファイルの中を調べます。アセットファイルは (ゲーム名)_Dataフォルダーの resources.assets にあります。今回は Unity Assets Bundle Extractor(UABE) を使ってアセットファイルを調べることにしました。

PoE1の場合ですとアセット内に、フォント EspinosaNova-Regular と EspinosaNova-CapitularIV が Tyranny の場合ですと Lora-Regular などが格納されていました。 フォントはアセットの Type が Font(0x80) になっているのですぐにわかります。

以下は PoE1 のアセットの中です。PoE1の日本語フォントMODでは EspinosaNova-Regular と EspinosaNova-CapitularIV を日本語フォントに差し替えることでフォントを変更していました。

Pillars of Eternity の場合。いくつかのフォントが登録されている。

話はそれますが・・・
今、改めて見てみると NanumMyeongjo と NanumMyeongjoBold ってありますね。調べてみたところ、これは韓国語フォントでした。韓国のNAVERが無料配布しているらしいです。
「[PC]NAVERのフリーフォント「나눔글꼴」: かじりたてのハングルのブログ」
http://kajiritate-no-hangul.sblo.jp/article/177233928.html
PoE1は韓国語は未サポートなのに、フォントは入っているのか・・・過去にローカライズの計画があったのかもしれないですね。日本語の調査をやっていると時々このような面白い場面に出会うことがあります。何の役にも立ちませんけどね・・・

同様に PoE2 のアセット内を確認してみます。

あれ Arial だけなの? 一個しかない!?

フォントが格納されているはずの resources.assets の中には、Arial しかありません。 Dynamic font 機能を使用していれば、無い文字は自動的にパソコン内のフォントから持ってきてくれるはずなのに表示されない言うことは、Dynamic font 機能を使っていないのか?



さて、ここからは試行錯誤の連続です・・・

そこで、各国の設定方法がどうなっているのかを確認してみます。言語の設定は PillarsOfEternityII_Data\exported\localized フォルダー下に国別に言語フォルダーがあり、そのフォルダー内に language.xml に設定情報があります。

英語版
<Language>
  <Name>english</Name>
  <GUIString>English</GUIString>
</Language>

フランス語版
<Language>
  <Name>french</Name>
  <GUIString>Français</GUIString>
</Language>

ロシア語版
<Language>
  <Name>russian</Name>
  <GUIString>Русский</GUIString>
  <Charset>Cyrillic</Charset>
</Language>

中国語版
<Language>
  <Name>chinese</Name>
  <GUIString>简体中文</GUIString>
  <Charset>Hanzi</Charset>
</Language>

文字種の多い言語は<charset>でフォントを切り替えているのかも知れないです。そこで、中国語版を参考に以下のように日本語の言語区分を作ってみました。

日本語版
<Language>
  <Name>jp</Name>
  <GUIString>Japanese</GUIString>
  <Charset></Charset>
  <Charset>Hanzi</Charset>
</Language>

メインメニューのテキストを日本語に変更し、実行してみたのが冒頭で紹介した画像です。漢字は表示されましたがひらがながでませんでした。ちなみに、テキストは言語フォルダー内の *.stringtable ファイルにあり、XML形式のファイルで文字コードはUTF-8(BOMなし)となっています。例えば、メインメニューであれば gui.stringtable です。
何の根拠もなくcharsetに Meyrio とか指定してやってみましたが・・・(略)



むむ~、なんか日本語化の難易度が一気に上がっています。以前が Easy モードだとすれば2~3段階上のVery hardくらいになった感じです。 このままでは、前に進まないので、公式フォーラムをちょっと覗いてみました。
「Pillars of Eternity II: Deadfire - Obsidian Forum Community」
https://forums.obsidian.net/forum/121-pillars-of-eternity-ii-deadfire/
 しかし、発売されて間もない状況では特に参考になる情報はありませんでした。



一体何処にフォントがあるんだろう?こうなったら片っ端からファイルの中を見ていくことにします。まずは、PillarsOfEternityII_Data\assetbundles 内にある *.unity3d ファイルから始めてみます。確かだいぶ前にツールをダウンロードした記憶があるが・・・この前のHDDクラッシュで失われてしまったようです。
そこで、"*.unity3d" ファイルが読み込めるツールを探すことにしました。最近、ソフトを探す時はまず GitHub を検索することが多くなりました。主にC#用の物を探します。他の言語はよくわからないし・・・



・・・で、今回も良いものを見つけました。このツールは生きが良いです。今日現在(2018/05/12)も開発が進められていますので、期待が持てます!
「Perfare/AssetStudio: AssetStudio is a tool for exploring, extracting and exporting assets and assetbundles.」
https://github.com/Perfare/AssetStudio
いざコンパイルしてみるといくつかエラーが表示されます。Webページにあった前提ソフトを入れてなかったためでした。AssetStudioFBX が必要なので
「FBX Software Developer Kit 2018.0 | Autodesk Developer Network」
https://www.autodesk.com/developer-network/platform-technologies/fbx-sdk-2019-0
 ここから、FBX SDK 2019.0 VS2015 をダウンロードしインストールしました。この中にC言語用のincludeとlibがあるのでそれを指定しコンパイルすることで、ビルドできるようになりました。実行するとこんな感じです。

Mesh や Texture を簡単に見れます。

このツールの特徴はなんと言っても、すぐに画像が見れることです。Mesh や Texture、Font などを表示したり Export することができます。しかし、変更や Import する機能はありません。
ゲームを解析する時は、片っ端から中身を見ることが多いのですばやく閲覧できるツールが見つかったのは大きな収穫です。



では早速、AssetStudioを使って *.unity3d ファイルを調べてみます。ファイルは全部で17。すべて見てみることにします・・・
ゲーム内の船や町の画像などが見られて楽しいです。しかし、目的のフォント関連は全く見つかりませんでした。って言うか、中を見終わってから思ったのですが、*.unity3d ってそもそもそういう目的のものではないような気がしてきました。



ダメだ・・・わかんねぇ~
そう言えば Unity のバージョンが上がってたけど何かあるのかなぁ?まぁ、新しくゲームを作るんだからその当時の最新バージョンを使うのが妥当だとは思うけど、文字の表示方式がガラッと変わったってことはなにかあるのかも知れない。リリースノートでも見てみるか・・・
「Unity 5.6のリリースと、Unity 5の完了 – Unity Blog」
https://blogs.unity3d.com/jp/2017/03/31/5-6-is-now-available-and-completes-the-unity-5-cycle/
お?! TextMesh Proってなんだ?高度なテキストレンダリングを実現だと? この記事によると・・・
TextMesh Pro は、Unity の既存のテキストコンポーネント (Text Mesh や UI Textなど) を置き換えるものです。
・・・置き換えるだと! これはビンゴなのか???

そして無料で使用可能って書いてある。とりあえず、Unityをインストールして見よう。ゲームのバージョンに合わせて Unity 5.6.3をインストール。でも、なんか話が逸れているような気もするので、インストールまででとりあえずおしまい。何かあったら使ってみよう。



再びフォント探し再開。
せっかく新しいツール(AssetStudio)を手に入れたから、もう一度 resources.assets の中を観察。う~む、画像がすぐ見れるのは嬉しい。

お!何やら怪しいファイルを発見!

なんだ、ここにあったのか!
・NANUMMYEONGJO SDF Atlas
これはハングル文字でした。

・simkai_1_of_2 SDF Atlas
・simkai_2_of_2 SDF Atlas
この二つは中国語です。

フォントテクスチャのサイズはハングル、中国語共に4096x4096となっており、文字数が多いからなのか中国語ではフォントテクスチャが二面になっていました。日本語では最低でも7~8,000文字の漢字を登録する必要があります。

中国語のフォントテクスチャの一部



あれ?どうでも良いけど、アセットの中になんで禁則文字のテキストファイルがあるんだ!?
・LineBreaking Following Characters
・LineBreaking Leading Characters
いかんいかん、話がそれてる。

しかし、何故か文字が格納されているファイルには SDF と言う文字が付いてる気がする。SDFってなんだ?
とりあえず、「unity sdf font」でググってみる・・・
え!なんか TextMesh Pro の記事ばかりがヒットするなぁ。ビンゴだったのか??
だけど、フォントの座標情報ファイルが見つからない。フォントテクスチャだけあってもどの文字が何処にあるのかがわからないと困る・・・



ここで一旦 TextMesh Pro の事を調べてみることにしました。
入門用の良いスライドを見つけたので、ちょっと TextMesh Pro のお勉強。
「【Unity道場 博多スペシャル 2017】Textmesh proを使いこなす」
https://www.slideshare.net/UnityTechnologiesJapan/unity2017text-meshpro
「Unity道場スペシャル 2017博多】TextMesh Pro を使いこなす」
https://www.slideshare.net/UnityTechnologiesJapan/text-meshprounity
 「【Unity道場スペシャル 2017大阪】カッコいい文字を使おう、そうText meshならね」
https://www.slideshare.net/UnityTechnologiesJapan/unity-2017text-mesh
TextMesh Proではアジア圏の禁則処理もサポートされてるみたい。さっき見つけた禁則処理用のファイルは、これのことだったのか。ついでにもう一度リリースノートを読み直してみると・・・
TextMesh Pro は、主要なテキストレンダリングパイプラインとして符号付きディスタンスフィールド(Signed Distance Field, SDF) を使用し、任意のポイントサイズと解像度でテキストをはっきりとレンダリングすることができます。
 って書いているじゃないですか!
ビンゴ!!!



大分わかってきたような気がしますが、まだ座標情報が何処にあるのかが謎です。
現時点で解決すべき謎は・・・

  1. フォントテクスチャの作成方法
  2. 座標情報の謎解き
  3. アセットファイルにあるフォントテクスチャの差し替え方法の調査

・・・ですね。

次はこのフォントテクスチャの作成方法と座標情報がどこにあるのかを調べていきます。とりあえず、Unity の TextMesh Pro でテキストを表示してみるサンプルアプリを作ってみようかな。

謎は深まるばかりだ! 出口は見つかるのか?

では・・・

3 件のコメント:

  1. コメントのテスト

    返信削除
  2. TextMeshProはUnityに標準で取り込まれたんですかー
    自分が調べていたころは有料だったので記事は中途半端で終わっていますw

    返信削除
    返信
    1. コメント上手くいきましたね。TextMesh Pro は 2017バージョンから標準になったようですね。

      削除

Raspberry Pi 3 Model A+ で広告ブロックサーバーを作る(その2)

前回作成した 広告ブロックサーバー の稼働状況をAmbientにアップロードするスクリプトを書いたのでメモを残しておきます。