Unity開発の新常識!? Localizationパッケージでアプリ内テキストを管理する

Localizationパッケージはローカライズだけではなくテキストを管理するのにとても便利なので、最初から入れておこうというお話です。

Localizationパッケージとは

UnityにはLocalizationという名前の公式パッケージがあります。

docs.unity3d.com

このパッケージはいわゆる多言語対応をするためのパッケージですが、ローカライズしないアプリに関してもテキスト管理に使うと便利な仕組みになっています。
また導入しておけば、後からローカライズが必要になった時にもスマートに対応できます。

本記事ではこのLocalizationパッケージを使ってテキスト管理を行うための知識についてまとめます。

テキスト管理あるある

ゲーム開発においてテキストの管理は重要な課題です。
例えば今、ゲーム内にOKと書かれたボタンが複数あることを考えます。
ボタンには複数のデザインがあり、デザインごとに異なるPrefabとして保存されていますが、テキストは全て同じ「OK」です。

OKボタン

ここで、この「OK」というテキストを全て「決定」に変更することになったとします。
「OK」という文字列はPrefabに保存されてしまっているので、全てのPrefabのテキストを一つ一つ変更していく必要があります。

テキストを変更

これは明らかに非効率です。
対応策としてまず思いつくのが、スクリプトによる文字列管理です。
Enumや定数で文字列を管理して、スクリプトを通して適用します。

using System;

public enum Text
{
    OkButton,
    CancelButton
}

public static class TextExtensions
{
    public static string GetString(this Text self)
    {
        return self switch
        {
            Text.OkButton => "決定",
            Text.CancelButton => "キャンセル",
            _ => throw new ArgumentOutOfRangeException(nameof(self), self, null)
        };
    }
}

この方法は一見良さそうに見えますが、エンジニアを介さないとテキストが変更できないという問題を持っています。
テキストを変更したいのはほとんどのケースで非エンジニアです。
それにもかかわらずちょっとしたテキストの変更も毎度エンジニアに依頼しなければならないワークフローは非効率で、無駄な労力が掛かります。

理想的にはエンジニアを介さずテキストを変更できるワークフローが求められます。

Localizationでテキストを管理する

Localizationパッケージを使うと、それぞれのテキストにキー名を割り振り、そのキー名を使ってアクセスすることができます。
例えば前節の例のOKボタンのテキストにOkButtonというキーをつけてアクセスすることができます。

Localizationでテキスト管理

この設定は専用のGUIツールを使って行われるため、エンジニアの手は必要ありません。

またテキストを変えたい時にはこの値を変更すれば、このキー名を使っている全てのテキストが変更されます。

テキストを変更

もちろんこのように値を変更する際にもエンジニアの手は必要ありません。

この設定を行うためにはLocalizationパッケージの基本的な使い方を知っておく必要があります。
以下の記事ではインストールからテキストの設定手順まで一通りの流れを説明していますので、必要に応じて参照してください。

light11.hatenadiary.com

なお次節に記載している通り、Localizationパッケージをローカライズに使うにはより深い知識が必要になりますが、テキスト管理に使う上ではひとまず上記の記事の内容だけ把握していれば十分です。

本来はローカライズのためのパッケージ

さてここまでLocalizationパッケージによる文字列管理についてまとめました。

このLocalizationパッケージは本来、名前の通りローカライズを行うためのパッケージです。
下図のように、各言語に対応するテキスト(など)を設定してキーでアクセスすることによりローカリゼーションを実現する仕組みです。

ローカライズ用パッケージ

一つの言語だけしか使わないプロジェクトであっても文字列にキーを通してアクセスする仕組みは使えるので、本記事ではそれを利用してテキスト管理に使っています。

またプロジェクトの初期にはローカライズを想定せずに作り始めたものの、あとからローカライズが必要になるといったケースもあります。

このとき、前述のような定数による管理をしていると後から他の言語に対応することが難しくなります。これに対して最初からLocalizationパッケージで管理しておけばスマートに対応できます。

そういう意味でも最初からこれを導入しておくメリットは大きいといえます。

CSVやSpreadSheet入出力にも対応

テキスト管理を考えた時に気になるのが、その文字列をSpreadSheetなどの外部ツールで管理できるかという点です。
実際、テキストデータはUnity上で編集するよりもSpreadSheetで編集した方が効率的なケースは多々あります。
そのため、LocalizationパッケージにはSpreadSheetとの同期機能が実装されています。これについては以下の記事にまとめていますので、必要に応じて参照してください。

light11.hatenadiary.com

またCSV形式での入出力もサポートしているので、SpreadSheet以外のツールでの管理もやりやすくなっています。

light11.hatenadiary.com

注意点: Addressablesの使用が前提

Localizationパッケージを使用する際の注意点として、LocalizationパッケージはAddressableを使うことを前提としているということがあります。
よってビルドしたアプリケーションで使用する際にはプレイヤービルド前にAddressableアセットシステムのビルドを行う必要があります。

ビルド方法の詳細は以下の記事の「Addressableのビルドを自動化する」節に書いてあります。

light11.hatenadiary.com

この記事にも書いてありますが、Unity2021.2以上、Addressables 1.19.4であれば、Addressable Asset SettingsBuild Addressables content on Player Buildにチェックを入れればプレイヤービルド時に自動でAddressablesもビルドされるようになります。

Build Addressables Content on Player Build

なおテキスト管理だけでなくローカライズに使う際にはもう少し踏み込んだAddressableアセットシステムの知識が必要になりますが、その時に学べば問題ないワークフローになっています。

まとめ

以上、Localizationパッケージで文字列を管理する方法についてまとめました。

本ブログでは他にもLocalizationパッケージに関する記事を掲載していますので、より詳細な情報を得たい方はぜひ参照してください。

light11.hatenadiary.com

参考

docs.unity3d.com

関連

light11.hatenadiary.com

light11.hatenadiary.com

light11.hatenadiary.com

light11.hatenadiary.com