[UE5]今更聞けないローカライズ～アセット編～

# はじめに
インディーズでも容易にゲームを配信できるようになった現代。
より多くのユーザーに遊んでもらうためにできる努力は様々ですが、ゲーム内のテキストをあらゆる言語に翻訳する"ローカライズ"もユーザーを増やす一助となります。

ローカライズにはテキストをそれぞれの国の言葉に翻訳するものだけでなく、テクスチャやモデルなどのいわゆるアセットをローカライズするものも含まれます。

本記事ではUE4/5環境でのアセットローカライズ方法について説明を行います。

## 事前情報
本ページ内で当然のように出てくるローカライズに関する単語を列挙します。
・言語タグ：どの言語かを識別するタグ。詳細は過去の記事を御覧ください。

https://qiita.com/_efe/items/967c8718e729a1788bf0

# アセットローカライゼーションの概要
UEではマテリアルやメッシュ、Niagaraなど、uasset化されているものであれば大抵のアセットを同じ手段でローカライズすることが可能です。

![2023-09-22_16h12_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/1ebd31f8-4539-9761-76c8-d1874c7de7d0.png "テクスチャをローカライズした例")

またUEのローカライズの仕組みでは起動時に設定された言語のアセットのみをロードして起動するため、ゲーム内で言語切り替えを行いたい場合は別の言語のアセットをロードするため、言語の設定後再起動する必要があります。
再起動したくない場合は全言語のアセットをランタイムで保持しておくか、自前で変更先言語のアセットをロードする仕組みをつくる必要があるため、ここでは紹介しません。

本記事で記載することのほとんどは公式ドキュメントに記載されていることのため、バージョンがあがった場合などは[<INS>最新の公式ドキュメント</INS>](https://docs.unrealengine.com/5.1/ja/asset-localization-in-unreal-engine/)を参照してください。

# 開発環境
UE5.1 ※UE4でも手順は変わりません。

# 実装
ここではテクスチャをアセットローカライズする例を紹介しますが、設定の方法などは基本的にメッシュなどでも同じです。

## 設定方法

テスト用のテクスチャをインポートしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/5270bcc7-c01d-3fd3-5947-dae8f71344da.png)

テクスチャの右クリックメニューから [アセットローカライゼーション] - [ローカライズされたアセットを作成] を選択すると、どの言語用のアセットを作成するかが選べます。
![2023-09-22_16h54_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/f3eccd89-b297-951e-538d-f2c4eafeeb78.png)

任意の言語を選択すると、`/コンテンツ/L10N/選択した言語の言語タグ/~元テクスチャのパスと同じ~/`というディレクトリにテクスチャが作成されるので、ソースを変更して再インポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/9d99bf08-ab3b-7f6d-515f-adb3164a2fdb.png)
![2023-09-26_10h49_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/f0e2fd77-3653-da93-eba4-485ccb5ce037.png)

設定は以上です。

## 確認方法

適当に確認用のアセットを用意し、ゲーム内で見えるようにしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/ebdd7a50-752d-bcb6-871b-2a1ba0a95f8f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/d7664a11-1709-a9b9-0707-e6839638aadc.png)

ツールバーメニューの [︙] から [詳細設定...] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/fa32da93-24a3-ff23-08d0-5e54f6029705.png)

エディタの環境設定ウィンドウが開くので、[追加の起動パラメータ] 部分にどの言語で立ち上げるかを記載します。ここでは英語（en）を指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/413c5b5b-79f2-44ab-d502-0cec58506b0c.png)

```c++:起動パラメータ
language=任意の言語タグ
```

ツールバーメニューの [︙] から [スタンドアローンゲーム] をクリックしてゲームを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/c91f72d3-f9a2-f715-fe2f-c00cf0a7e153.png)

起動パラメータに設定した言語にテクスチャが変わっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/ac2ab1c9-e1c7-d643-9c38-b8dba1352004.png)
通常のPIE起動だとアセットローカライズの読み替えは起きませんのでご注意ください。

# 注意点

## ◆ローカライズアセットを作ろうとしたら対象の言語がない＞＜
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/89b203ae-a35c-1ff1-f41a-d25bf2bea361.png)

・<INS>【確認事項】既にローカライズアセットを作成済みではないか？</INS>
→[ローカライズされたアセットを表示] をオンマウスして、その中に対象の言語があれば既にローカライズアセットを作成済みです。
そのアセットを編集するか削除して作成し直しましょう。

・<INS>【確認事項】設定にローカライズ対象の言語がマークされていないのではないか？</INS>
→アセットのローカライズをする前に、ローカライズ対象の言語を設定しておく必要があります。

[ツール] - [ローカライゼーションダッシュボード] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/372df6a4-84db-75c1-4aad-449d4aefd16c.png)

ローカライゼーションダッシュボードのカルチャ部分に列挙されているものがローカライズ対象の言語としてマークされているものです。
追加したい場合は、[新規カルチャーを追加] から追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/30c7a818-018a-a127-9832-fd91f2b89f55.png)

言語を追加したら [テキストをコンパイル] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/a2920c68-3544-ba64-ff10-9a7cda392179.png)

なにやらダイアログが出てきますが、今回はローカライズ対象の言語を追加したいだけなので詳細は省略します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/9be7a5dd-374e-3d0d-641d-d9072d070e90.png)

コンパイル終了後ローカライズアセットを作成しようとすると、言語が追加されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/7456c95a-f4bc-b41f-e9bb-aefd341e1f16.png)


## ◆L10Nディレクトリが出てこない＞＜
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/059b137e-6c18-27d7-38c4-4d2040856a11.png)

・<INS>【確認事項】コンテンツブラウザの設定内 [ローカライズされたコンテンツを表示] にチェックがはいっているか？</INS>
→チェックをいれると出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/d95ce1b9-a57b-451e-c831-c5c05473cabc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/5f8ebfaf-13f0-ba94-5c2a-149a17862d28.png)

## ◆ちゃんと設定したのにローカライズされるアセットとされないアセットがある＞＜
この例では犬も猫をアセットローカライズの対象としていて、言語を切り替えて再起動をしても犬のアセットしか変更されていないという現象が起きています。
![TestDev-_64-bit-Development-PCD3D_SM6_-2023-09-26-17-18-35.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/f8bc6e3c-4bd3-1068-5ecd-6acd443b38c9.gif)
※ここでの確認は起動引数なしでスタンドアローン起動をし、UIに入力された言語タグをカレントの言語へ設定、OpenLevelで再起動をするようなテスト環境を用意しています。

・<INS>【確認事項】ローカライズアセットを作成しているか？</INS>
→愚問ですが対応する言語毎にローカライズアセットを作成しているか確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/86920454-68a6-c884-4250-e819468715ca.png)

・<INS>【確認事項】GameInstanceでアセットをハード参照していないか？</INS>
→ソフト参照にするか、不要であれば参照を切りましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/d4dba357-342a-9cdb-3059-666d0b2d65a3.png)
GameInstanceはゲームを起動している限りレベルが変わっても常駐し続ける特殊なクラスです。
そのためレベルの切り替わり（再起動）によってアセットの読み替えを行うアセットローカライズは、GameInstanceからハード参照されているアセットに**適用されません**。
GameInstanceから直にハード参照されていないかはもちろんのこと、GameInstanceの子孫のどこかでハード参照されていると、いくらゲーム内で再起動をかけてもリロードはされないので注意しましょう。



# まとめ
アセットローカライズは結構簡単にできます。
確認が少し手間だったり、うまくいかないこともあるかもしれませんが、原因は紐解いていけば単純なはず。
実装～確認までアーティストだけで完結しますが、参照関係などはプログラマの手を借りないとわからない部分だと思うので連携して実装していければいいですね。

![TestDev-_64-bit-Development-PCD3D_SM6_-2023-09-26-17-49-09.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548800/43489bea-05ab-e165-47e7-9632549d16c4.gif)

# 参考

https://docs.unrealengine.com/5.1/ja/asset-localization-in-unreal-engine/