3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[UE5] DataTable の項目をコンボボックスで表示する

Last updated at Posted at 2023-08-05

C++ で作った DataTable 構造体には FDataTableRowHandle という便利な機能があります。
13cfd214db8a645bafaec9f54ca6a9f7.png
プロパティ編集時に DataTable のアセット指定と RowName を選択する UI が生成されます。

RowName を指定してデータを取得する

USTRUCT( BlueprintType )
struct FHogeDataTableRow : public FTableRowBase
{
	GENERATED_BODY()

	UPROPERTY(EditDefaultsOnly)
	int32 Hoge = 0;
};

FTableRowBase を継承した FHogeDataTableRow を作って、

    UPROPERTY( EditDefaultsOnly, meta = ( RowType = "/Script/[ModuleName].HogeDataTableRow" ) )
	FDataTableRowHandle RowHandle;

UPROPERTY.metaRowType を指定します。

const auto* FoundRow = RowHandle.GetRow<FHogeDataTableRow>( ANSI_TO_TCHAR( __FUNCTION__ ) );
if ( !FoundRow )
{
	UE_LOG( LogTemp, Warning, TEXT( "%s: not found!" ), *RowHandle.ToDebugString() );
}

GetRow でデータを取得します。
引数の ContextString には、用途が分かるような文字列を渡すとよいでしょう。

ANSI_TO_TCHAR は文字化けを防ぐために追加してます。
めんどくさいのでいい方法ないかなぁ。。。

おまけ

FDataTableCategoryHandle も使いたかった

列名 ColumnName から値 RowContents に一致した複数行を取得する構造体。
RowContents には文字列以外の型も指定できる。
image.png
HogeName の列に対して値が Category1 の行を取得する。
image.png
この場合は NewRow_1 NewRow_2 が取得できる。

TArray<FHogeDataTableRow*> FoundRows;
CategoryHandle.GetRows<FHogeDataTableRow>( FoundRows, ANSI_TO_TCHAR( __FUNCTION__ ) );

手元の UE5.3 Preview では、エディタの言語設定が日本語だとクラッシュします。
英語だと問題なし。

DataTable 以外なら GetOptions も便利

UPROPERTY(meta=(GetOptions="GetTestOptions"))
FString Test;

UFUNCTION()
TArray<FString> GetTestOptions() const
{
    return { "A", "B", "C" };
}

UFUNCTION 定義の関数名を指定すれば OK。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?