Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)

5,648 views

Published on

発表者: 郷津風さま(ソレイユ株式会社)
本スライドは2019年10月31日に行われた勉強会「 UE4 Localization Deep Dive」の講演資料となります。ソレイユ様、このような貴重な情報を一般に公開していただきまことにありがとうございます!

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)

  1. 1. 最新UE4タイトルでの ローカライズ事例 ソレイユ株式会社 エンジニア 郷津 風 2019/10/31
  2. 2. 目次 • 自己紹介 • 事前情報 • 概要 • 実装手順(StringTable, LocalizationDashboard, Blueprint) • 設定手順(Config,C++側) • 応用編(設定,字幕) • 注意点 • まとめ
  3. 3. 自己紹介
  4. 4. 自己紹介 • 郷津 風(ごうづ ふう) • エンジニア • 元 Webのサーバエンジニア • 現 ゲームのプログラマ • 直近 • UI全般 • 多言語対応 • プラットフォーム対応 • とかとか
  5. 5. 事前情報
  6. 6. 事前情報 • 三人称視点のシングルプレイ アクションゲーム • UE4のバージョンは4.20->4.22 • 新しいバージョンが出る度に調査してからアップデート • 多少のバージョンアップによる問題は力づくで対応 (シーケンサーとかシーケンサーとかシーケンサーとか)
  7. 7. 事前情報 • 対応した言語は10言語 ※ゲームの言語設定はコンソールの設定を反映 言語 言語タグ 英語 en フランス語 fr フランス語 (カナダ) fr-CA スペイン語 es スペイン語 (ラテンアメリカ) es-419 言語 言語タグ 日本語 ja ドイツ語 de 中国語 (簡体字) zh-Hans ロシア語 ru ポルトガル語 (ブラジル) pt-BR
  8. 8. 事前情報 • 対応した言語は10言語 言語 言語タグ 英語 en フランス語 fr フランス語 (カナダ) fr-CA スペイン語 es スペイン語 (ラテンアメリカ) es-419 何が違うのかわからない…
  9. 9. 事前情報-おまけ フランス語(カナダ)- • フランス語(カナダ)とは… • ケベック州で話されケベコアと呼ばれる 日本語 フランス語 ケベコア ガード Blocage Parade ロングソード Broadsword Épée à deux mains デバッグ Débogue Débogage 翻訳者のさじ加減 のような気もする
  10. 10. 事前情報 • ローカライズの対象 • テキスト全般 • アセット(フォントのみ) • 決定、キャンセルボタンの位置 • ※音声は非対応
  11. 11. 事前情報 • 対応したプラットフォームは4つ • PS4 • XboxOne • Nintendo Switch • Steam
  12. 12. 事前情報 • Widget Blueprintについての知識 • LocalizationDashboardについての知識 • Localizationの公式ドキュメント (https://docs.unrealengine.com/en- US/Gameplay/Localization/index.html)
  13. 13. 概要
  14. 14. 概要-ポイント- • LocalizationDashboardだけを使っている • デフォルト言語に”使わない言語”を設定 • 追加・編集が簡単、動作が確認しやすい
  15. 15. 概要-ポイント- • LocalizationDashboardだけを使っている • 自社ツール、素敵なシステムは一切使っていない • 問題が起こったらEngineのコードいじって対応
  16. 16. 概要-ポイント- • デフォルト言語に”使わない言語”を設定 • パブリッシャーが海外→デフォルト言語は日本語にできない • 翻訳データは頻繁に更新されるもの • LocalizationDashboardにおいて、 デフォルト言語の翻訳変更はクリティカル!!!!! ※後ほど解説
  17. 17. 概要-ポイント- • 追加・編集が簡単、動作が確認しやすい あのテキストも必要だった 追加して 翻訳変わったからよろしく 翻訳追加になったから やっといて 最大文字数いくつですか? はみ出し確認したいんですけど ここ字幕も出したいんだけど 企画 アート このテキストの 全言語翻訳ください
  18. 18. 概要-ポイント- • 追加・編集が簡単、動作が確認しやすい あのテキストも必要だった 追加して 翻訳変わったからよろしく 翻訳追加になったから やっといて 最大文字数いくつですか? はみ出し確認したいんですけど ここ字幕も出したいんだけど 企画 アート このテキストの 全言語翻訳ください プログラマだけでは対応しきれない!!!
  19. 19. 概要-ポイント- • 追加・編集が簡単、動作が確認しやすい • どのセクションの人でも簡単に確認・設定できる • 企画 :どの部分にテキストを表示するか決める • レベル :レベルギミックでテキストを表示したい • アニメーター :字幕表示したい • UIアーティスト:表示される最大文字数を確認したい : テキスト・翻訳の追加方法、テキストの確認方法を ドキュメント化しておけばプログラマの仕事が減る
  20. 20. 概要-実装の流れ- • StringTableにローカライズタグを設定 • LocalizationDashboardの作業 • ターゲットの追加 • カルチャーの追加 • テキストの収集→翻訳→コンパイル • (テキストのインポート/エクスポート) • Widgetにローカライズタグをセット
  21. 21. 概要-実装の流れ- • StringTableにローカライズタグを設定 →ローカライズ対象となるテキストを一覧で用意する Widgetにセット するときに使う ローカライズタグ としてデフォルト 言語に収集される
  22. 22. 概要-実装の流れ- • LocalizationDashboardの作業 →ローカライズ対象のテキストを集めて翻訳データを設定する LoadingPolicyの設定(翻訳 のタイミング)→Always 翻訳対象の収集先設定 →StringTable 翻訳言語に対する操作 ターゲットの追加(翻訳 データのまとまり)
  23. 23. 概要-実装の流れ- • Widgetにローカライズタグをセット →翻訳データが紐付いたローカライズタグを設定する StringTableのNamespaceと Keyで翻訳データを取得
  24. 24. 実装手順(エディタ側)
  25. 25. 実装手順-LocalizationDashboardの仕組み- • デフォルト言語1つに対して、各種言語の翻訳データが紐づく デフォルト言語
  26. 26. 実装手順-LocalizationDashboardの仕組み- こんにちは Hello GutenTag Здравствуйте Bonjour 「こんにちは」に「Hello」や「GutenTag」が 紐付いている
  27. 27. 実装手順-LocalizationDashboardの仕組み- ご機嫌いかが? ??? ??? ??? ??? 「こんにちは」から「ご機嫌いかが?」に書き換え られると、紐付いていたテキストが切られる
  28. 28. 実装手順-LocalizationDashboardの仕組み- • デフォルト言語1つに対して、各種言語の翻訳データが紐づく →使用しない言語をデフォルト言語にして固定する デフォルト言語
  29. 29. 実装手順-LocalizationDashboardの仕組み- Knight_Greeting_01 こんにちは Hello GutenTag Здравствуйтеローカライズタグに各言語の翻訳が紐付いている
  30. 30. 実装手順-LocalizationDashboardの仕組み- Knight_Greeting_01 ご機嫌いかが? How Are You? GutenTag Здравствуйте 各言語の翻訳が変更されてもローカライズタグは変 わらないので紐付けが切られない
  31. 31. 完成しているゲームに対して LocalizationDashboardで対応 →デフォルト言語が書き換わらないため、 LocalizationDashboardを使うことで簡単 に多言語対応が可能 実装手順-LocalizationDashboardの仕組み- 開発中のゲームに対して LocalizationDashboardで対応 →使いづらい。デフォルト言語の翻訳が 変わるとややこしくなるので工夫が必須 (デフォルト言語に使わない言語を設定す るなど)
  32. 32. 実装手順-実装の流れ- • StringTableにローカライズタグを設定 • LocalizationDashboardの作業 • ターゲットの追加 • カルチャーの追加 • テキストの収集→翻訳→コンパイル • (テキストのインポート/エクスポート) • Widgetに設定
  33. 33. 実装手順-ローカライズタグ設定-
  34. 34. 実装手順-ローカライズタグ設定- Namespace... Dashboard上にテキストが収集されたときにここ がソートの基準になるので意外と重要
  35. 35. 実装手順-ローカライズタグ設定- Key:Namespace内でプライマリ SourceString:翻訳対象のテキストだが、ローカ ライズタグとして扱う。
  36. 36. 実装手順-ローカライズタグ設定- CSV形式でImport/Exportが可能なのでExcelとか でも管理ができる
  37. 37. 実装手順-StringTableの運用ルール- • アセット名とNamespace名 • ST_XXXXX • KeyとSourceString • 基本的に同じ文字列(※例外あり) • アイテム名などある程度決まっているものは開発名 • NPCの会話などまったく未定なものは連番をふったもの • 字幕は表示箇所別のタグ+ボイスの喋りだし数単語をつけたもの Namespace内で、 ・Key:プライマリ ・SourceString:セカンダリ ではあるが、Namespaceの垣根なく両方と もプライマリであったほうが後々便利
  38. 38. 実装手順-実装の流れ- • StringTableにローカライズタグを設定 • LocalizationDashboardの作業 • ターゲットの追加 • カルチャーの追加 • テキストの収集→翻訳→コンパイル • (テキストのインポート/エクスポート) • Widgetに設定
  39. 39. 実装手順-LocalizationDashboard- • GameTargetsの追加 →総合的にみるとターゲットは少ないほうがいい
  40. 40. 実装手順-LocalizationDashboard- • どこからテキストを収集するか設定 →ターゲット毎にStringTableのディレクトリを分けておく
  41. 41. 実装手順-LocalizationDashboard- • デフォルト言語を選定して追加 →ローカライズ対象以外の言語を設定する
  42. 42. 実装手順-LocalizationDashboard- • Gather->翻訳->Compile
  43. 43. 実装手順-LocalizationDashboard- • デフォルト言語の編集画面 Source : StringTableから収集されたテキスト Translation : デフォルト言語の翻訳(ローカライズタグ)
  44. 44. 実装手順-LocalizationDashboard- • 日本語の編集画面 Source : デフォルト言語の翻訳(ローカライズタグ) Translation : 日本語の翻訳データ
  45. 45. 実装手順-LocalizationDashboard- • 翻訳 →poファイル形式でインポート/エクスポートも可能
  46. 46. 実装手順-おまけ .poファイル- • Portable Object file • 翻訳用のファイル形式(.pot, .mo などの仲間) • Key:Value形式で翻訳データの入力が可能 • 1つのGameTargetにつき、1言語1poファイルができる UI (GameTarget) UI.po (デフォルト言語) UI.po (日本語) UI.po (ドイツ語)
  47. 47. 実装手順-おまけ .poファイル- • .poファイルの中身
  48. 48. 実装手順-おまけ .poファイル- • Poedit(poファイル編集用の無料ツール)
  49. 49. 実装手順-LocalizationDashboard- • 翻訳 →poファイル形式でインポート/エクスポートも可能 Gather→Export→翻訳→Import→Compile 企画 企画Publisher
  50. 50. 実装手順-LocalizationDashboard- • 翻訳 →poファイル形式でインポート/エクスポートも可能 1ターゲット(計2000ワード)にコンパイル -> 10分 5ターゲット(計2000ワード)にコンパイル -> 50分 →ワード数ではなくターゲット数に比例して時間がかかる
  51. 51. 実装手順-GameTargetsの運用ルール- • ターゲットの粒度 • ローカライズタグがプライマリにできるくらい • なるべくターゲットは増やさない • ターゲットに設定するStringTableの分類 • 更新頻度が高くなりそうなものはまとめる(無理) • StringTableはターゲット毎にディレクトリをわける ※全ターゲットの翻訳データを一括で操作していたため、このよ うな運用になった。更新されるターゲット数が少ないのであれば 必ずしも少なくする必要はない。
  52. 52. 概要-実装の流れ- • StringTableにローカライズタグを設定 • LocalizationDashboardの作業 • ターゲットの追加 • カルチャーの追加 • テキストの収集→翻訳→コンパイル • (テキストのインポート/エクスポート) • Widgetに設定
  53. 53. 組み込み-Widgetに設定- • 後から書き換える必要がない場合 →WidgetのUMG側で設定
  54. 54. 組み込み-Widgetに設定- • 後から書き換える必要がない場合 →WidgetのUMG側で設定
  55. 55. 組み込み-Widgetに設定- • 後から書き換える必要がない場合 →WidgetのUMG側で設定 設定するとエディタの設定言語に即時翻訳されるた め、長さやサイズ感を確認しながら作業可能 ※フォントのローカライズはされないので注意!
  56. 56. 組み込み-Widgetに設定- • 後から書き換える必要がある場合 →WidgetのBlueprint側で設定
  57. 57. 組み込み-Widgetに設定- • 後から書き換える必要がある場合 →WidgetのBlueprint側で設定
  58. 58. 組み込み-Widgetに設定- • マスターデータから設定 →FindTextInLocalizationTable()を使用する
  59. 59. ローカライズの流れまとめ • StringTableのSourceStringがデフォルト言語のSourceになる StringTableの編集画面 デフォルト言語の編集画面
  60. 60. ローカライズの流れまとめ • デフォルト言語のTranslationが翻訳対象のSourceになる デフォルト言語の編集画面 翻訳対象言語の編集画面
  61. 61. ローカライズの流れまとめ • WidgetにStringTableのKeyを設定すると、翻訳対象の Translationが表示される StringTableの編集画面 翻訳対象言語の編集画面
  62. 62. 設定手順(Config,C++側) デフォルト言語に”使わない言語”を設定したことによる問題の解決
  63. 63. 設定手順-おまけ 言語タグ- 言語 言語タグ 英語 en フランス語 fr フランス語 (カナダ) fr-CA スペイン語 es スペイン語 (ラテンアメリカ) es-419 言語 言語タグ 日本語 ja ドイツ語 de 中国語 (簡体字) zh-Hans ロシア語 ru ポルトガル語 (ブラジル) pt-BR
  64. 64. 設定手順-おまけ 言語タグ- • 言語タグってなに? • ハイフンによって接続された、 言語に関する下位タグの集まりのこと language - script - region -… 言語 文字体系 地域
  65. 65. 設定手順-おまけ 言語タグ- • 言語タグの使い方は結構自由! • よく使われるスタイル • language下位タグのみ : ja, en, de,… • language-region : en-UK, en-US, pt-BR,… • その他スタイル • language-script-region : zh-Hans-CN,…
  66. 66. 設定手順-CultureMappingの変更- オーストラリア英語の言語タグはen-AU Windows10の設定画面
  67. 67. 設定手順-CultureMappingの変更- あっ…
  68. 68. 設定手順-CultureMappingの変更- • 検出された言語がデフォルト言語だった場合、ローカライズタ グが表示されてしまう SettingCulture = en-AU ViewCulture = en-AU そうなっちゃいますよね
  69. 69. 設定手順-CultureMappingの変更- • 検出された言語がデフォルト言語だった場合、ローカライズタ グが表示されてしまっていた!! • さらに…
  70. 70. 設定手順-CultureMappingの変更- 言語 言語タグ 英語 en フランス語 fr フランス語 (カナダ) fr-CA スペイン語 es スペイン語 (ラテンアメリカ) es-419 言語 言語タグ 日本語 ja ドイツ語 de 中国語 (簡体字) zh-Hans ロシア語 ru ポルトガル語 (ブラジル) pt-BR アルゼンチンとかチリとかではスペイン 語(ラテンアメリカ)を表示してほしい… ポルトガルではポルトガル語(ブラジ ル)を表示してほしい…
  71. 71. 設定手順-CultureMappingの変更- • 検出された言語がデフォルト言語だった場合、ローカライズタ グが表示されてしまう • さらに… • 検出された言語がローカライズ対象じゃないときは、 Publisherの要望に沿った言語に書き換える必要がでた!
  72. 72. 設定手順-CultureMappingの変更- • 翻訳対象ではない言語が設定されていた場合、 設定された言語のlanguage下位タグの翻訳になる en en-UK en-US en-AU en-US設定 → en-USの翻訳 en-UK設定 → enの翻訳 en-AU設定 → enの翻訳 翻訳あり 翻訳なし
  73. 73. 設定手順-CultureMappingの変更- • enとen-AU(デフォルト言語)の翻訳データがある場合 en en-UK en-US en-AU en-UK, en-USの設定のときはenの翻訳に 自動的なるが、en-AUのときもenの翻訳 にしてほしい! 翻訳あり 翻訳なし こうしたい
  74. 74. 設定手順-CultureMappingの変更- • エンジンとConfigに処理を追加 • Config 自前のCultureMappingの設定を記述 • EngineCode 検出した言語をCultureMappingに登録されている言語で 上書き
  75. 75. 設定手順-CultureMappingの変更- • ~XXXXConfig_Platform__Platform_Game.ini • Internationalization.CultureMappingは検出用の文字列 • 検出された言語がen-AUのときにenに変更する • 左辺は各プラットフォーム側の言語タグ(※UE4の言語タグとは異なる 可能性があるので、プラットフォームのドキュメント参照) • 右辺はUE4側の言語タグ [Internationalization.CultureMappings] en-AU=en
  76. 76. 設定手順-CultureMappingの変更- • UE4EngineSourceRuntimeCorePrivate InternationalizationTextLocalizationManager.cpp • ReadSettingsFromConfigにCultureMappingsの 取得処理を追加 • 検出された言語のバリデート処理が入る前でCultureMappings を照らし合わせて上書きする
  77. 77. 設定手順-CultureMappingの変更- • UE4EngineSourceRuntimeCorePrivate InternationalizationTextLocalizationManager.cpp
  78. 78. 設定手順-CultureMappingの変更- • 社内に書き換えのノウハウがあったため、それを少しアレンジ して流用 • ※UE4公式の書き換え方法もあります。 (https://dq8iqaixvew1d.cloudfront.net/en- US/Gameplay/Localization/ManageActiveCultureRuntime/index.html#cultureremapping)
  79. 79. 設定手順-FallbackCultureの設定- • 検出した言語がローカライズ対象外の言語の場合、デフォルト 言語がそのまま表示されてしまう SettingCulture = it ViewCulture = en-AU そうなっちゃいますよね
  80. 80. 設定手順-FallbackCultureの設定- • 例 Knight_Greeting_01 こんにちは Hello Здравствуйте Bonjour 日本語(ja) 英語(en) ロシア語(ru) フランス語(fr) デフォルト言語(en-AU)
  81. 81. 設定手順-FallbackCultureの設定- • 例 language=ru で起動 (本体設定をロシア語で起動) Knight_Greeting_01 こんにちは Hello Здравствуйте Bonjour 日本語(ja) 英語(en) ロシア語(ru) フランス語(fr) デフォルト言語(en-AU)
  82. 82. 設定手順-FallbackCultureの設定- • 例 language=it で起動 (本体設定をイタリア語で起動) Knight_Greeting_01 こんにちは Hello Здравствуйте Bonjour デフォルト言語(en-AU) 日本語(ja) 英語(en) ロシア語(ru) フランス語(fr)
  83. 83. 設定手順-FallbackCultureの設定- • エンジンとConfigに処理を追加 • Config 翻訳対象外の言語が選択されたとき用の言語を設定 • EngineCode 翻訳対象外を検出し設定された言語で上書き
  84. 84. 設定手順-FallbackCultureの設定- • ~XXXXConfig_Platform__Platform_Game.ini • InternationalizationとFallbackCultureは検出用の文字列 • 翻訳対象外の言語時にenで上書きする [Internationalization] FallbackCulture=en
  85. 85. 設定手順-FallbackCultureの設定- • UE4EngineSourceRuntimeCorePrivate InternationalizationTextLocalizationManager.cpp • ReadSettingsFromConfigにFallbackCultureの取得処理を追加 • FallbackLanguageがデフォルト言語に設定される処理がある ので、そこで自前のFallBackCultureが設定されていればそち らを優先するように処理追加 • ※FallbackLanguageは元々UE4にある変数
  86. 86. 設定手順-FallbackCultureの設定- • UE4EngineSourceRuntimeCorePrivate InternationalizationTextLocalizationManager.cpp
  87. 87. 応用-設定編-
  88. 88. 応用-1つのキーに対して複数の値- • マスターデータに複数の翻訳キーを持たせるのはややこしい… →IDなどに紐づくキーに関しては別々に用意する必要はない かさばりがちなマスターデータのカラムを削減
  89. 89. 応用-1つのキーに対して複数の値- ItemA (開発名など) ItemAの名前 ItemAの説明 こっちをキーにする
  90. 90. • NamespaceとSourceStringを分けKeyは同じにする 応用-1つのキーに対して複数の値-
  91. 91. • NamespaceとSourceStringを分けKeyは同じにする 応用-1つのキーに対して複数の値- Namespaceが異なるため_Nameや_Infoは付ける必要はないが、これらの SourceStringをダッシュボードで同じターゲットにしてテキストを収集す るとSourceStringが混ざってややこしいので_Nameとか_Infoを付ける →翻訳やデバッグのわかりやすさを考慮
  92. 92. • マスターからキーを取得してNameSpaceだけ指定する 応用-1つのキーに対して複数の値-
  93. 93. 応用-翻訳内の一部を可変させる- • テキストの一部分を可変的に扱いたい ローカライズタグを削減
  94. 94. 応用-翻訳内の一部を可変させる- • 翻訳データ側に識別用のテキストをおいてもらって検出し、 参照したパラメータに置き換える String = 敵を[n]体倒す n=10 Array[] = {‘敵を’, n, ‘体倒す’} String = 敵を10体倒す マスターから取得 翻訳データを分解して 可変部分を検出 置き換えて出力 Task_DefeatEnemy 翻訳データ取得
  95. 95. 応用-翻訳内の一部を可変させる- • 翻訳データ側に識別用のテキストをおいてもらって検出し、 参照したパラメータに置き換える String = 敵を[n]体倒す n=10 Array[] = {‘敵を’, n, ‘体倒す’} String = 敵を10体倒す マスターから取得 翻訳データを分解して 可変部分を検出 置き換えて出力 Task_DefeatEnemy 翻訳データ取得 FindTextInLocalizationTable()
  96. 96. 応用-翻訳内の一部を可変させる- • 翻訳データ側に識別用のテキストをおいてもらって検出し、 参照したパラメータに置き換える String = 敵を[n]体倒す n=10 Array[] = {‘敵を’, n, ‘体倒す’} String = 敵を10体倒す マスターから取得 翻訳データを分解して 可変部分を検出 置き換えて出力 Task_DefeatEnemy 翻訳データ取得 ParseIntoArray() Split()
  97. 97. 応用-翻訳内の一部を可変させる- • 翻訳データ側に識別用のテキストをおいてもらって検出し、 参照したパラメータに置き換える String = 敵を[n]体倒す n=10 Array[] = {‘敵を’, n, ‘体倒す’} String = 敵を10体倒す マスターから取得 翻訳データを分解して 可変部分を検出 置き換えて出力 Task_DefeatEnemy 翻訳データ取得 Append()
  98. 98. 応用-翻訳内の一部を画像にする- • チュートリアルなど、文章中にボタンの画像を入れたい!
  99. 99. RichTextBlock? なにそれ? 参考: https://www.unrealengine.com/ja/tech-blog/advanced-text-styling-with-rich-text-block https://docs.unrealengine.com/en-US/Engine/UMG/UserGuide/UMGRichTextBlock/index.html
  100. 100. 応用-翻訳内の一部を画像にする- • チュートリアルなど、文章中にボタンの画像を入れたい! • ただこれには問題が…
  101. 101. 応用-翻訳内の一部を画像にする- • 画像を入れるとUE4のテキストボックスの機能 [AutoWrapText]は使えなくなる!! • それでもいい!とにかく文章中に画像を入れたいんだ!! 改行は翻訳側に明示するから画像を入れさせてくれ!!
  102. 102. 応用-翻訳内の一部を画像にする- • VerticalBox内に明示的に改行された数だけHorizontalBoxを作る
  103. 103. 応用-翻訳内の一部を画像にする- • HorizontalBox内にテキストと画像を詰めていく
  104. 104. 応用-翻訳内の一部を画像にする- • 処理の流れ • 翻訳データから画像の識別テキストを検出 • テキスト部分と画像部分がわかるように配列に格納 • テキストや画像を作りながらHorizontalBoxに詰める • 改行用識別テキストの場合はHorizontalBoxを新たに作る • VerticalBoxにHorizontalBoxを詰める
  105. 105. 応用-翻訳内の一部を画像にする- • 翻訳データ側に識別用のテキストをおいてもらって検出する String = ‘普通の攻撃は [Btn_A][BR]強い攻撃は [Btn_B][BR]で出ます’ Array[] = { ‘普通の攻撃は’, Btn_A, BR, ‘強い攻撃は’, Btn_B, BR, ‘で出ます’ } 翻訳データを分解して 可変部分を検出 翻訳データ取得 Btn_A Btn_B : マスターから取得 Tutorial_Attack 識別テキスト
  106. 106. 応用-翻訳内の一部を画像にする- • 識別用テキストによって、HorizontalBoxやテキストや画像を 生成する 生成された要素をHorizontalBoxに、 HorizontalBoxをVerticalBoxに格納 配列の各要素を生成翻訳データを分解して 可変部分を検出 Array[] = { ‘普通の攻撃は’, Btn_A, BR, ‘強い攻撃は’, Btn_B, BR, ‘で出ます’ } テキストの生成 画像の生成 HorizontalBox の生成 普通の攻撃は 強い攻撃は で出ます
  107. 107. 応用-翻訳内の一部を画像にする- • VerticalBoxの設定用変数 • EVerticalAlignment:VerticalBoxのアライン • HorizontalBoxの設定用変数 • EHorizontalAlignment:HorizontalBoxのアライン • テキストの設定用変数 • SlateFontInfo:フォント、サイズなど • SlateColor:フォントの色 • float x2:テキストの上下の幅(Padding用) • 画像の設定用変数 • Vector2D:画像のサイズ • float x2:画像の左右の幅(Padding用)
  108. 108. 応用-Mediaplayerに字幕-
  109. 109. Localized Overlays? Basic Overlays? なにそれ? 公式ドキュメントがない!!!!!
  110. 110. 応用-MediaPlayer中に字幕を表示- • TimeLineを追加
  111. 111. 応用-MediaPlayer中に字幕を表示- • TimelineにEventTrackを作成しキーを置く
  112. 112. 応用-MediaPlayer中に字幕を表示- • キーは横軸が字幕開始タイミング(Valueは適当)
  113. 113. 応用-MediaPlayer中に字幕を表示- • Mediaの再生とともにTimelineを起動(Play) • Timelineに実行ピンが追加される (Subtitle) • Timeline上の表示タイミングに合 わせて、処理が実行される • 出てきたタイミングで字幕Widget の表示を行う
  114. 114. 応用-MediaPlayer中に字幕を表示- • 表示する字幕テキストと表示秒数は予め配列で持っておき、カ ウンタ変数で配列番号を指定して表示
  115. 115. 注意点
  116. 116. 注意点-StringTableの読み込み- • マスターデータからキーを取得して表示!
  117. 117. 注意点-StringTableの読み込み- • あれぇ…? 設定 ローカライズデータがみつからない ローカライズデータがみつからない ローカライズデータがみつからない ローカライズデータがみつからない
  118. 118. 注意点-StringTableの読み込み- • FindTextInLocalizationTable()を呼ぶだけではロードされない • 変数や初期値に設定するなどしてメモリに読み込 んでおく必要があります。
  119. 119. 注意点-デフォルト言語の選定- • ローカライズ対象にできる言語は多い(言語タグ)
  120. 120. 注意点-デフォルト言語の選定- •ニャンコレ語(nyn) ・響きがかわいい! ・言語タグもかわいい!! • デフォルト言語に採用!!!
  121. 121. 注意点-デフォルト言語の選定- •ニャンコレ語(nyn) ・響きがかわいい ・言語タグもかわいい • デフォルト言語に採用! 某コンソールの Buildが通らない
  122. 122. 注意点-デフォルト言語の選定- • ニャンコレ語(nyn) ・響きがかわいい ・言語タグもかわいい • デフォルト言語に採用! • マイナーすぎる言語は避けましょう。 オーストラリア英語 でいいんじゃない?
  123. 123. 注意点-GameTargetsの数- • GameTargetsを分けて翻訳データの管理をしや すくしよう! • GameTargetsを細かい粒度で設定! 翻訳データを反映するぞ!
  124. 124. 注意点-GameTargetsの数- • GameTargetsを分けて翻訳データの管理をしや すくしよう! • GameTargetsを細かい粒度で設定! 翻訳データを反映するぞ! GameTargets数に比例して コンパイル時間が増える
  125. 125. 注意点-GameTargetsの数- • GameTargetsを分けて翻訳データの管理をしやすくしよう! • GameTargetsを細かい粒度で設定! • むやみに増やさないようにしましょう。
  126. 126. 注意点-デフォルトターゲットの扱い- • デフォルトで用意されているターゲットGame
  127. 127. 注意点-デフォルトターゲットの扱い- •自分たちの任意の粒度でターゲットを設定 しよう! • デフォルトであったターゲットGameは使わない!削除!
  128. 128. 注意点-デフォルトターゲットの扱い- •自分たちの任意の粒度でターゲットを設定 しよう! • デフォルトであったターゲットGameは使わない!削除!パッケージに翻訳データが 一切入らなくなる
  129. 129. 注意点-デフォルトターゲットの扱い- • パッケージの設定を確認してみたところ…
  130. 130. 注意点-デフォルトターゲットの扱い- • パッケージングの設定を確認してみたところ… 翻訳対象の言語に黄色い ビックリマークがついてる
  131. 131. 注意点-デフォルトターゲットの扱い- • パッケージングの設定を確認してみたところ… • どうやら他にターゲットがあっても、デフォルトターゲットの Gameからローカライズ言語を取得しているらしい…
  132. 132. 注意点-デフォルトターゲットの扱い- • 自分たちの任意の粒度でターゲットを設定 • デフォルトであったターゲットGameいらない!削除! • 削除しないで最低限の状態でおいておきましょう。
  133. 133. まとめ
  134. 134. まとめ • UE4だけでローカライズを実装! • デフォルト言語に”使わない言語”を設定することで翻訳データ の変更に強い実装になった →要エンジンの改造 • タグの追加(StringTable)、ローカライズの確認(UE4Editor)、 タグのセット(Blueprint,C++)が誰でも容易 →要ワークフロー整備、ドキュメント化
  135. 135. まとめ • UE4だけでローカライズを実装! • デフォルト言語に”使わない言語”を設定することで翻訳データ の変更に強い実装になった • タグの追加(StringTable)、ローカライズの確認(UE4Editor)、 タグのセット(Blueprint,C++)が誰でも容易 • 新しい機能の追加や隠された機能の情報には敏感に!!
  136. 136. おまけもあるよ!
  137. 137. 本編に入らなかったおまけ
  138. 138. 地域によるボタンの入れ替え • 日本では決定ボタンは右ボタンがオーソドックスだが、他国で は下ボタンが多い
  139. 139. 地域によるボタンの入れ替え • FPlatformInput::GetGamepadAcceptKey().GetFName() • Gamepad_FaceButton_Bottom • Gamepad_FaceButton_Left • 決定ボタンの位置が分かれば、それに合わせてKeyMapを書き 換えるだけ!
  140. 140. ローカライズの対象 • ゲームのタイトル画面での「Press Any Button」 • 新しいコンテンツが追加されたときの「New」 • などなど… • 英語→日本語に”あえてしない”という選択肢もある。 ゲームの雰囲気やゲームの年齢層に沿ってローカライ ズ対象を決めるのがいい(フランス語圏は知らない)
  141. 141. おまけもあるよ! ほろかわいい!

×