【UE5】 UE5 DataTableの行のみをEditorで指定して取り出す

DataTableの指定の行を取り出したいときに

通常
DataTatbleを指定 -> RowNameを検索 -> 要素を取り出す
という流れになりますが
その際の設定ミスを減らしたいと思い調べたものをまとめました。

DataTableをフィルタリング

EditorでDataTableを指定する際に以下のように書くとプロジェクト内すべてのDataTableが候補に出てきます。

UPROPERTY(EditDefaultsOnly)
UDataTable* PlayerStatusDataTable;

指定の行のみを取り出すには
Unreal側に用意されているFDataTableRowHandleを使用すると以下のようになります。

UPROPERTY(EditDefaultsOnly, meta = (RowType ="/Script/TESTProject.MyDataTable"))
FDataTableRowHandle PlayerStatusData;


あとは以下のように書くと指定のRowの要素を取得することができます。

		if(PlayerStatusData.IsNull())
		{
			UE_LOG(LogTemp, Warning, TEXT("DataTableRowHandle is valid"));
			return;
		}
		FMyDataTable* MyDataTable = PlayerStatusData.GetRow<FMyDataTable>(FString("ContextText"));
		UE_LOG(LogTemp, Warning, TEXT("Name: %s"), *MyDataTable->Name);

これでデータを作成してもらう人に設定する際に
Rowの名前を文字列で指定する事がなくなるのでデータの設定ミスなどが防げるかと思います。

余談ですが
以下のような記述でDataTableを指定する部分のフィルタリングができないかと思いましたが
動作しないようでした.
DataTableはRowTypeを指定しているので記述方法はあっていると思うのですがなにか別の書き方があるのか…

UPROPERTY(EditDefaultsOnly, meta = (RowType = "/Script/TESTProject.MyDataTable"))
UDataTable* EnemyAsset;

【UE5】RetainerBox->GetEffectMaterial()がnullになる問題

RetainerBox->GetEffectMaterial()でDynamicInstanceMaterialを取得して
マテリアルのパラメータを変更しようとしたときに遭遇した問題メモ

問題

WidgetをAddToviewportしたときにRetainerBoxのマテリアルの画像を差し替えたりする
初期化処理を実装していると
RetainerBox->GetEffectMaterial()
の返り値がnullptrになってしまう事があった。

解決策

呼び出しのタイミングの問題
具体的には
NativeOnInitializedで呼び出すとnullを返して
NativeConstructだと正常に動作する。


NativeConstructはAddtoViewPortされる度に呼ばれるので注意が必要
NativeConstructでフラグを使って一度のみ初期化する
のような対応が必要になってしまう
NativeOnInitializedは一度のみしか呼ばれないのでそちらのほうがキレイに書けるが
エンジン側の都合なのでどうしようもなさそうである…

【UE5】 CommmonUIとRetainerBoxを使用した際に遭遇した問題

CommmonUIプラグインでCommonActivatableWidgetStackを使用して
画面遷移を作成した際に遭遇した問題です。

発生状況

CommonActivatableWidgetStackにAddWidgetでWidgetを追加したときに
追加したWidgetの中身にOverlayが親になっているRetainerBoxがあると以下の警告ログが表示される。

The requested size for SRetainerWidget is 0. W:0 H:0

RetainerBoxの子にはimageが一つだけ置いてあり
SetBrushFromSoftTexture
で画像の差し替えを行っていました。

解決策

調査したところ
CommonActivatableWidgetStackの基本機能の画面遷移の問題のようで

Transitionの時間を0にするとログは出なくなります。

Transitionをつけたい場合は以下のような方法がありました。
– RetainerBoxの親にCanvasPanelを配置する
– Fadeが終わったタイミングでRetainerBoxをVisibleにする

Fadeが終わったタイミングでRetainerBoxをVisibleにする
こちらの方法は
画面のFadeが終わったタイミングで表示を呼ばないとうまく動作しないようでした。
例 : Transition = 0.4に指定した場合
fadeInに0.2s fadeOutに0.2sかかるので
Constructが呼ばれてから0.2sより後にRetainerBoxをVisibleにすれば
ログは消えました。

しかしFadeOut中に透明な状態が見えてしまうので対応は難しそうでした。

かなりのレアケースな問題ですが
ネットに情報がなくて困ったのでメモしておきます。

【UE5】CommonUIとEnhancedInputの連携作業メモ

こちらの公式サイトの情報をもとに作業してわかりにくかった点、気がついたことなどを綴ります。
※2024/12/19時点での情報です。

3-3

>PlayerMappableKeySettingsの[Settings] で、ICommonMappingContextMetadataInterfaceを実装するオブジェクトに [Metadata] フィールドを設定します。

とありMetaTadataにUI_GenericMetadataIMCが設定されているが
これはあらかじめ作成しておく必要がある。
アセットの候補にすべてのUobjectが表示されているのでわかりにくい。

また、サイトの画像ではUI_GenericMetadataIMCという名前になっているが
サイト内の説明では名前をMetadata UI_IA_GenericMetadataにすると記載されている?
(その後の説明ではUI_IA_GenericMetadataにもどっている)

1.ステップ5~6を繰り返しますが、今回はIsGenericInputActionのチェックをオフにします。~

上記のコメント部分のステップ5~6に当たる部分がサイト内では表記されていない

1.コンテンツブラウザで右クリックし、~
2.データアセットクラスとして ~
3.UI_IA_GenericMetadataを開き~
この部分が誤りで正しくは
4.コンテンツブラウザで右クリックし、~
5.データアセットクラスとして ~
6.UI_IA_GenericMetadataを開き~
になるのではないか?
ステップ5~6を繰り返す

ICommonMappingContextMetadataInterfaceを実装する
データアセットクラスをもう一つ作成するという意味っぽい

動作確認をして
随時更新していきます。

UE5 ButtonWidgetのEventの発火タイミングメモ(キーボード、ゲームパッドの場合

Widget標準のボタンに付いている5つのイベントを
Unrealの標準機能のWidgetをキーボード、ゲームパッドで操作するNavigation機能を使用した際の挙動です。
※UE5.3.2で確認

OnClicked

Widgetが選択されている状態で決定ボタンを押して、
Widgetの選択を移動せずに決定ボタンを離したときに呼び出されます。

Widgetが選択されている状態で決定ボタンを押して、
Widgetの選択を移動してから決定ボタンを離しても呼びだされません。

OnPressed

Widgetが選択されている状態で決定ボタンを押した時に呼び出されます。

OnReleased

Widgetが選択されている状態で決定ボタンを押下して
同じWidgetを選択している状態で決定ボタンを離したときに呼ばれます
OnClickとまったく同じ挙動。

違いとして
Widgetが選択されている状態で決定ボタンを押下して
Widgetを移動すると移動した瞬間にOnReleasedは呼ばれます(OnCLickedは呼ばれない

OnHovered OnUnHovered

この二つはキーボードでは呼び出されることが確認できませんでした。
マウス専用のイベントなのかもしれない?