データ レジストリ は、USTRUCT
タグの付いたデータ構造体用の、効率的なグローバル ストレージ スペースです。データ レジストリでは、同期および非同期の両方のデータ アクセスとユーザー定義のキャッシング動作がサポートされます。データ レジストリは、一般的な読み取り専用データを使用するよう設計されています。
データ レジストリはプラグインの一部です。「データ レジストリ」で操作を行うことで操作を指導して、いくつかの基本的な概念に慣れることができます。ストーリーの進展やキャラクターの途中の状態など固有セッションベースのデータに対しては、エンジンの Save Game システムを使用します。
データ レジストリは、アセット スキャンによる検索と手動による登録で、幅広いソースからデータをロードまたは生成するように設定できます。データ レジストリは コンポジット データ テーブル と似ているものの、標準的なテーブルの行に加えてカーブ データを格納することができ、複数のテーブルを手動で合成するのではなく、間接レイヤーを使用します。
データ ソース
データ レジストリは、データ レジストリ ソース と メタデータ レジストリ ソース という 2 つの種類からデータを収集します。 これらのソースは実際のデータ項目ではありません。むしろ、データ レジストリはデータ アイテムの検索や生成のためにこれらを使用します。 特定のデータ項目が 1 つのソース内で見つからないと、データ レジストリはリスト内でそのデータ項目の後に表示されるソースの中を検索するので、データ レジストリ内でのデータソースの表示順序は重要です。
これにより、オーバーライドおよびフォールバック動作の可能性が生まれ、コンテキスト固有のソースが一般的なソースをオーバーライドできるようになります。 Data Registry プラグインには Data Tables と Curve Tables をラップする組み込みデータ レジストリ ソースとメタデータ レジストリ ソースが含まれています。
データ レジストリは、データ レジストリ ソース と メタデータ レジストリ ソース という 2 つの種類からデータを収集します。 これらのソースは実際のデータ項目ではありません。むしろ、データ レジストリはデータ アイテムの検索や生成のためにこれらを使用します。 特定のデータ項目が 1 つのソース内で見つからないと、データ レジストリはリスト内でそのデータ項目の後に表示されるソースの中を検索するので、データ レジストリ内でのデータソースの表示順序は重要です。
これにより、オーバーライドおよびフォールバック動作の可能性が生まれ、コンテキスト固有のソースが一般的なソースをオーバーライドできるようになります。
Data Registry プラグインには Data Tables (UDataTable
) と Curve Tables (UCurveTable
)をラップする組み込みデータ レジストリ ソースとメタデータ レジストリ ソースが含まれています。
データ レジストリ ソース
データ レジストリは、データ レジストリ アセット内の配列で作成および構成するデータ レジストリ ソース オブジェクトのセットを直接所有します。これらのオブジェクトは、データ レジストリが個々のデータテーブルや Web データベースなど情報を検索することができる特定のデータソースへのインターフェイスです。 C ++ デベロッパーは、データ レジストリ ソースの子クラスを作成して他のタイプのデータを処理したり、さまざまな間接ルールを実装して識別子をデータ項目にマップすることができます。 プロジェクトに 1 つ以上のデータ レジストリ ソースの子クラスがある場合、データ レジストリ アセットに新しいデータソースを追加すると、それらがリストに表示されます。
データ レジストリは、データ レジストリ アセット内の配列で作成および構成が可能なデータ レジストリ ソース オブジェクトのセットを直接所有します。
これらのオブジェクトは、データ レジストリが個々のデータテーブルや Web データベースなど情報を検索することができる特定のデータソースへのインターフェイスです。
他のタイプのデータを処理するために UDataRegistrySource
を作成したり、さまざまな間接ルールを実装して識別子をデータ項目にマップすることができます。
データ レジストリ アセットに新しいデータソースを追加すると、それらがリストに表示されます。
メタ データ レジストリ ソース
メタデータ レジストリ ソースはランタイム時に他のデータ ソースを作成および所有します。メタデータ レジストリ ソースは、すべてのデータソースを明示的に一覧表示するのではなく、ユーザー名のパスのセットをスキャンするなどの一般的なルールを使用して、データ項目を含むアセットを検索します。 また、特定のアセットの手動登録をリッスンすることもできます。 メタデータ レジストリ ソースは動的に生成されるため、検出したデータソース (およびそれらのソース内のデータ項目) は、ランタイム時にデータレジストリにロードされます。
データレジストリ ソースと同様に、C ++ デベロッパーは、メタデータ レジストリ ソースの子クラスを作成して、他のデータタイプを処理したり、さまざまなスキャン ルールを作成したりできます。
プロジェクトに 1 つ以上のメタデータ レジストリ ソースの子クラスが含まれている場合、データ レジストリ アセットに新しいデータソースを追加すると、それらがドロップダウン リストに表示されます。
メタデータ レジストリ ソースはランタイム時に他のデータ ソースを作成および所有します。メタデータ レジストリ ソースは、すべてのデータソースを明示的に一覧表示するのではなく、ユーザー名のパスのセットをスキャンするなどの一般的なルールを使用して、データ項目を含むアセットを検索します。また、特定のアセットの手動登録をリッスンすることもできます。
メタデータ レジストリ ソースは動的に生成されるため、検出したデータソース (およびそれらのソース内のデータ項目) は、ランタイム時にデータレジストリにロードされます。
データレジストリ ソースと同様に、メタデータ レジストリ ソースの子クラスを作成して、他のデータタイプを処理したり、さまざまなスキャン ルールを作成したりできます。これを行うには、UMetaDataRegistrySource
クラスをオーバーロードします。
データ レジストリ アセットに新しいデータソースを追加すると、作成した子クラスがドロップダウン リストに表示されます。
識別子
Data Registry プラグインは独自の識別子を使用し、データ レジストリおよびそこに含まれる個別のデータ項目を識別し、検索します。これらの識別子は、文字列ベースの名前 ですが、FDataRegistryType
(データ レジストリ アセット用) および FDataRegistryId
(データ レジストリ内の個別項目用) 構造体は、ラッパーとして機能し、便利なエディタ内機能を提供します。
FDataRegistryType
はデータ レジストリ アセットを識別しますが、FDataRegistryId
はデータ レジストリとその内部の個別データ項目を識別します。データ レジストリ アセットを見つける、またはそこから個別のデータ項目を取り出す必要があるとき、これらの識別子タイプを使用します。各データ レジストリ アセットは [Registry Type] フィールドに一意の名前が必要です。
各データ レジストリ アセットは、Registry Type フィールドに一意の名前を付ける必要があります。 このフィールドに 2 つのデータ レジストリ アセットが同じ値を保持している場合、システムにより一方だけが認識され取り込まれます。同様に、複数のデータ項目が同じ識別値 (名前または Gameplay Tag) を共有する場合、レジストリはすべての項目を読み取りますが、取り出し処理は、データ レジストリ アセットがロードした最初の対象だけにアクセスします。データ項目をロードする順序に関する情報については、データ ソース のセクションを参照してください。
C++ を使用するデベロッパーは、子の Data Registry クラスを作成し、ResolveDataRegistryId
関数でオーバーライドすることにより、この動作を変更できます。
データ レジストリ アセット識別子
データ レジストリ アセットを設定する際、デベロッパーは [Registry Type (レジストリ タイプ] フィールドを一意の名前の値に設定する必要があります。これがデータ レジストリの識別子です。この値を設定すると、新しいデータレジストリ名がエディタ全体のすべてのレジストリ タイプ フィールドのドロップダウンリストにすぐに追加されます。
これにより、他のアセットのデータ レジストリを参照するときに、スペルミスによるユーザー エラーを防ぎ、選択プロセスがさらに迅速で簡単になります。
データ レジストリ アセットを設定する際、デベロッパーは [Registry Type (レジストリ タイプ] フィールドを一意の名前の値に設定する必要があります。これがデータ レジストリの識別子です。
この値を設定すると、新しいデータレジストリ名がエディタ全体の FDataRegistryType
フィールドのドロップダウンリストにすぐに追加されます。
これにより、他のアセットのデータ レジストリを参照するときに、スペルミスによるユーザー エラーを防ぎ、選択プロセスがさらに迅速で簡単になります。

上に示したのは、データ レジストリ アセットの識別子の設定です。 下に示したのは、データ レジストリ アセットを参照する必要があるアクタで、識別子またはデータ レジストリ内の特定行を選択するものです。

データ項目の識別子
データ テーブル内の行など、個々のデータ項目を識別するには、データ レジストリ アセットとデータ項目自体を指定する必要があります。データ レジストリ ID には両方の識別子が含まれます。その データ レジストリ タイプ フィールドはドロップダウン リストとして表示され、そこから識別名で既知のデータ レジストリを選択することができます。 ドロップダウン リストからデータ レジストリの名前を選択すると、Data Registry ID フィールドがデータ レジストリに合わせて変更されます。データ レジストリの ID 形式にゲームプレイ タブを使用すると、ユーザー インターフェースはゲームプレイ タグとそのすべての子を含むフィルター リストを表示します。 データ レジストリの ID 形式にゲームプレイ タブを使用すると、ユーザー インターフェースはデータ レジストリ アセットに含まれる含むすべての既知の行のドロップダウン リストを表示します。
データ テーブル内の行など、個々のデータ項目を識別するには、データ レジストリ アセットとデータ項目自体を指定する必要があります。FDataRegistryId
は両方の識別子を含みます。その データ レジストリ タイプ フィールドはドロップダウン リストとして表示され、そこから識別名で既知のデータ レジストリを選択することができます。
ドロップダウン リストからデータ レジストリの名前を選択すると、Data Registry ID フィールドがデータ レジストリに合わせて変更されます。
データ レジストリの ID 形式にゲームプレイ タブを使用すると、ユーザー インターフェースはゲームプレイ タグとそのすべての子を含むフィルター リストを表示します。 データ レジストリの ID 形式にゲームプレイ タブを使用すると、ユーザー インターフェースはデータ レジストリ アセットに含まれる含むすべての既知の行のドロップダウン リストを表示します。
データ レジストリ アセットを編集する場合、データ項目の識別子を使用して、参照する他のアセットで変更がすぐに有効にならないことがあります。 これが起きる場合、データ項目の識別子のドロップダウン リストに古い行が含まれることがあります。 データ レジストリ (データ レジストリ アセット自体ではなく) を参照する、アセットで [Compile (コンパイル)] ボタンをクリックして、インターフェースをその時点のデータ項目情報で更新します。

左側で、Gameplay Tag を使用する ID フォーマットで、データ レジストリ アセットに対する項目を選択します。 右側で、シンプルな名前を使用するデータ レジストリ アセットに対する項目を選択します。
FDataRegistryId
に FDataRegistryType
メンバー (RegistryType
という名前) があるので、個別の FDataRegistryType
識別子を必要とせずに、行を含むデータ レジストリ アセットを見つけることができます。
識別子の解決
システムは、指定したデータレジストリ ID の 項目名 を検索してデータ項目を検索します。C ++ で子データ レジストリ クラスを作成することにより、この動作を変更できます。詳細を確認するには、本ページの C++ バージョンへ切り替えてください。
動的識別子の解決
デフォルトでは、システムは、入力した FDataRegistryId
の ItemName
の値を検索することでデータ項目を検索します。これがプロジェクトにとって理想的な動作ではない場合は、独自の UDataRegistry
サブクラスを作成し、 MapIdToResolvedName
関数をオーバーライドして、ローカル スコープに追加の FDataRegistryResolverScope
構造体を含めることができます。FDataRegistryResolverScope
サブクラス内の ResolveIdToName
関数をオーバーライドすることで、動的なプレイヤー固有の情報を使用した場合でも受け取る行の名前を再マップすることができます。ID を解決すると、(システム内で) 一意であることが保証され、キャッシュの一意の ID として使用される FDataRegistryLookup
が生成されます。
クイック関数リファレンス
次の関数は、データ レジストリを開始するときに役に立ちます。これは完全なリファレンスではありませんが、これらの関数は、プロジェクトでデータ レジストリをセットアップした後に、データにアクセスする必要がある場合の基本になります。
- Acquire Data Registry Item は指定された項目を検索し、成功するとそれをキャッシュにロードします。他のデータレジストリ関数はキャッシュされたデータ項目にしかアクセスできないため、メタデータ レジストリ ソースらのデータ項目には非常に重要です。存在すると思われる (または存在する可能性がある) が、現在キャッシュにないデータ項目にアクセスする場合は、この関数を呼び出します。
この関数を呼び出すと、右側のピンからすぐに実行が再開されます。戻り値は、ロード操作の結果ではなく、ロード操作が開始されたかどうかを示します。失敗は、操作を開始できず、接続したコールバック関数が呼び出されないことを意味します。コールバック関数が実行されると、検索操作と読み込み操作が終了します。このセクションで説明する他の関数を使用して、データが正常に読み込まれたと想定して、キャッシュからデータを取得することができます。その時点でデータがすぐにキャッシュにない場合、データは見つかりませんでした。
データ項目を一度は正常に取得したものの、後で取得できなかったという場合は、キャッシュから削除されている可能性があります。Acquire Data Registry Item を再度呼び出し、コールバック関数に入ったらすぐに取得します。プロジェクトの特定のニーズに合わせて、データ独自のコピーを作成したり、データ項目のキャッシュ動作を調整するとよいでしょう。

- Find Data Registry Item は、データ レジストリのキャッシュ内の項目をチェックし、項目ムが見つかったかどうかに基づいて分岐します。見つかると、右側の Out Item ピンを通ってアクセスします。この関数はすぐに戻るため、キャッシュに存在してはいるもののキャッシュにないデータ項目は見つかりません。

- Get Data Registry Item は Find Data Registry Item に似ていますが、分岐する代わりに成功 / 失敗の値を返し、成功すると左側の Out Item ピンに接続された変数に自動的にデータを入力します。この関数はすぐに戻るため、キャッシュに存在してはいるもののキャッシュにないデータ項目は見つかりません。

- Evaluate Data Registry Curve はキャッシュされたカーブを探します。これも同期しているため Find Data Registry Item と同様にすぐに戻りますが、関数呼び出し時にそのカーブがキャッシュにないとカーブを見つけることができません。この関数は、成功と失敗の結果に基づいて実行を分岐し、失敗時に指定したデフォルト値を返します。この機能は、カーブ データが利用可能かどうかに関係なく、出力値が必要な場合に使用することができます。

UDataRegistrySubsystem::Get
| UDataRegistrySubsystem
インスタンスへのポインタを返します。リストで唯一の静的関数です。サブシステムへのエントリ ポイントとして機能します。|
|UDataRegistrySubsystem::GetRegistryForType
| 名前または FDataRegistryType
(スタンドアロンまたは FDataRegistryId::RegistryType
からのいずれか) を取得し、一致するデータ レジストリへの ` UDataRegistry` ポインタを返します (存在する場合)。|
UDataRegistrySubsystem::RegisterSpecificAsset |
FDataRegistryType でデータ レジストリを検索し、特定のアセットを追加します。有効な FDataRegistryType を指定しない場合、サブシステムはサブシステム内のすべてのデータ レジストリへのアセットの追加を試みます。少なくとも 1 つのデータ レジストリがアセットを受け入れた場合、 true を返します。 |
UDataRegistry::GetCachedItem |
指定した FDataRegistryId に対応するデータ項目をデータ レジストリで検索します。関数呼び出し時に項目がキャッシュにない場合、関数は null を返します。それ以外の場合、関数は、データ レジストリが格納する構造体タイプへの const ポインタを返します。 |
UDataRegistry::GetAllCachedItems |
データ レジストリのキャッシュされた各項目に対する、エンジンの UScriptStruct データ (const uint8* として) へのポインタがマップに入ります。このとき項目の FDataRegistryId をキーとして使用します。個別の出力パラメータを通じて、UScriptStruct 自体も利用できます。UScriptStruct::ExportText 関数を使用してキャッシュされた各アイテムの内容をログに記録するなど、デバッグ ツールとしてキャッシュを反復処理する場合に便利です。 |
UDataRegistry::EvaluateCachedCurve |
指定した FDataRegistryId に対応するカーブを見つけ、指定入力値に対して評価します。要求したカーブが呼び出し時にキャッシュにない場合は、この関数は失敗します。関数の戻り値はタイプ FDataRegistryCacheGetResult であり、要求したカーブのキャッシュされたステータスに関する情報、そして何よりもカーブが見つかったかどうかに関する情報を提供します。タイプ float のカーブの出力値は、出力パラメータを介して取得されます。 |
UDataRegistry::AcquireItem |
GetCachedItem と同様ですが、キャッシュされていない場合でも、項目を見つけます。この関数は非同期で、検索が完了したときに FDataRegistryItemAcquiredCallback タイプのコールバック関数を実行します。関数の戻り値は、コールバックのスケジューリングが成功したことを示す bool です。false が戻されると、エラーが発生し、コールバック関数が実行されないことを意味します。true が戻されると、コールバック関数の実行を意味しますが、データ項目の存在を保証するものではありません。 |
データ レジストリから取得した構造体ポインタをキャッシュすることは、安全でない可能性があります。データ項目は常に使用可能なデータ項目がある一方で、動的にロードされ、データ レジストリが警告なしにアンロードできるデータ項目もあります。 アンロード可能なデータを処理する可能性がある場合は、データ取得直後にデータを使用するか、データ レジストリからのポインタを保持せずに独自のコピーをキャッシュすることをお勧めします。
ゲーム機能との統合
Data Registry プラグインは、データ レジストリと Game Feature プラグインから個別のデータ レジストリ ソースの両方を追加できます。このプロセスの仕組みについては、「Game Features と Modular Gameplay」を参照してください。