assets と locale
パッケージ化されたアセット id を、この実行環境が読み込める URL に解決し、プレイヤーの言語に追従する
それぞれ独立して宣言する、二つの小さな機能です。
{
"contributes": {
"runtimeCapabilities": ["assets", "locale"]
}
}assets
app.game.assets は、プロジェクトのパック内のアセット id を、現在の実行環境が読み込める URL に変換します。これがなければ、プラグインはゲーム内部のプロトコル文字列をハードコードするしかなく、しかもこの文字列はデスクトップ版と Web 版の間で異なります。
| メソッド | シグネチャ |
|---|---|
url | (assetId: string) => string |
const src = app.game.assets?.url(String(ctx.params.iconAssetId ?? ""));同期的なので、ウィジェットのレンダラー内でも純粋なノード内でも安全に使えます。
assets は Dev Mode には存在しません。そこでのアセット解決は非同期の IPC を経由しますが、この機能のシグネチャは同期の url() です。両者は折り合わないため、このドメインはそもそも提供されません。アセットに基づく画像を描画するプラグインは Dev Mode 用のフォールバックを持たなければなりません。さもないと、それをテストする作者は空のボックスを目にし、プラグインのせいだと考えるでしょう。Preview および、あらゆるエクスポートビルドでは利用できます。
locale
app.game.locale は ゲームの 表示言語です。プレイヤーが選んだもので、実行中のプロジェクトのローカライズデータによって設定されます。その言語に翻訳されたプロジェクトの文字も読み取れます。
| メンバー | シグネチャ |
|---|---|
current | readonly string |
onChange | (listener: (locale: string) => void) => RuntimePluginCleanup |
text | (key: string) => string | null |
words | (id: string, text: string) => string |
const locale = app.game.locale?.current ?? "en";
const stop = app.game.locale?.onChange(next => {
// `next` に合わせて文字を読み直す
});text(key)は、プロジェクトの翻訳キーを現在の言語で読み取ります。テーブルとフォールバックチェーンはGet Textノードと同じです。プロジェクトがそのキーを宣言していない場合はnullを返します。words(id, text)は、プラグインが直接書き、studio エントリーからapp.services.localization.registerWordsで翻訳に出した文字を読み取ります。idが指す単位の翻訳を言語のフォールバックチェーンに沿って探し、なければtextを返します。ゲームには翻訳だけが入り原文は入らないため、プラグインが書いたとおりの文字を渡します。プラグインが読めるのは自身の文字だけです。
これは読み取り専用です。プラグインはプレイヤーの言語に追従できますが、それを変更することはできません。
これを app.services.i18n と混同しないでください。あちらは エディタの UI 言語であり、studio エントリにのみ存在します。両者は異なる人が設定する異なる言語です。英語で編集している作者が、日本語で動くゲームをテストしていることもあり得ます。
text や words で読む文字は、ゲームのほかの部分と一緒にプロジェクトの翻訳テーブルで翻訳され、作者が加えるすべての言語が対象になります。onChange で読み直してください。