テーブルキーの生成
Key (キー) は、String Table または Asset Table 内の各エントリーに一意の識別子を提供します。キーは、2 つの一意の要素 (キー名とキー ID) から構成されます。

Localization Table の Key 列にはキー名、Key Id 列にはキー ID が表示されます。
キー名は変更可能ですがキー ID は変更できません。Unity は、アセットあるいはコンポーネント内のテーブルエントリーにアクセスする時に参照としてキー ID を使用します。
Distributed ID Generator
Unity はデフォルトでは Distributed Key Id Generator を使用して一意の Key Id 値 (それを生成するマシンに固有のもの) を提供します。このため、複数のユーザーが同じテーブルで作業しても安全です。一部のマージ競合を解決する必要がありますが、Unity は同じKey Id を 2 回生成することはないので、これらの競合は簡単に解決できます。
キーは 64 ビット長のデータ型で、以下のような構造になっています。
64 ビットのキーは以下の要素から構成されます。
| ビット数 | 名前 | 説明 |
|---|---|---|
| 12 (0-11) | Sequence Number | 0 から開始し、同じミリ秒中に行われた新しい ID リクエスト毎に 1 ずつ増加する、マシン毎のローカルカウンターです。 値は 12 バイトに制限されているため、このミリ秒の ID が使い果たされる前に含むことができる項目数は 4095 個で、ID ジェネレーターは次のミリ秒まで待機してからでないと続行できません。 |
| 10 Bits (12-21) | Machine Id | マシンの ID です。 デフォルトでは、エディターではこの値はマシンのネットワークインターフェースの物理アドレスから生成されます。 ただし、カスタム値に設定することも可能です。1024 台のマシンに十分なスペースがあります。 |
| 41 Bits (22-63) | Timestamp | カスタムエポック (あるいは開始時刻) (クラスの作成された時刻) を使用したタイムスタンプです。 表示可能な最大のタイムスタンプは、カスタムエポックから 69 年です。 その時点でキージェネレーターは全ての一意の ID を使い果たします。 |
| 1 Bit (64) | Signed Bit | ID ジェネレーターは、符号ビットを使用しません。 カスタムの ID 値を追加したい場合は、競合を避けるために、符号ビットを使用して負の値を持つキー ID を追加してください。 |
カスタム ID ジェネレーター
Unity の Distributed Key Id Generator による生成の代替として、カスタムのキー生成メソッドを適用することも可能です。これを行うには、SharedTableData プロパティの KeyGenerator を使用してください。
以下の例は、既存の String Table Collection を設定し、連続的なキーを使用するよう方法を示したものです。
using System.Linq;
using UnityEditor;
using UnityEditor.Localization;
using UnityEngine.Localization.Tables;
public class ChangeKeyGeneratorExample
{
public void ChangeKeyGenerator()
{
var stringTableCollection = LocalizationEditorSettings.GetStringTableCollection("My Game Text");
// Determine the highest Key Id so Unity can continue generating Ids that do not conflict with existing Ids.
long maxKeyId = 0;
if (stringTableCollection.SharedData.Entries.Count > 0)
maxKeyId = stringTableCollection.SharedData.Entries.Max(e => e.Id);
stringTableCollection.SharedData.KeyGenerator = new SequentialIDGenerator(maxKeyId + 1);
// Mark the asset dirty so that Unity saves the changes
EditorUtility.SetDirty(stringTableCollection.SharedData);
}
}