Author Archives: lovewcycle

【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

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

UE5 ButtonWidgetのEventの発火タイミングメモ(マウスの場合

Widget標準のボタンに付いている5つのイベントが発火するタイミングです。
※UE5.3.2で確認

OnClicked

マウス左ボタンをWidgetの上で押下し
マウスカーソルがWidgetの上にある状態で離したときに呼び出されます。

マウス左ボタンをWidgetの上で押下し
マウスカーソルがWidgetから移動し、離すと呼ばれません。

OnPressed

マウス左ボタンをWidgetの上で押下したときに呼び出されます。

OnReleased

マウス左ボタンをWidgetの上で押下し、
マウス左ボタンを離したタイミングで呼ばれます
Widgetの上にマウスカーソルがあるかどうかは関係なく呼び出されます。

OnHovered

マウスカーソルがボタンWidgetに乗ったときに呼ばれます

OnUnHovered

マウスカーソルがボタンWidgetの上から外れたときに呼ばれます

ちなみに右クリックだと
ボタンの上で押すとOnUnHoveredが呼ばれ、
離すとOnHoveredが呼ばれます。

UE5 Editorからアセットを選択する際にインターフェイスでフィルタリングする

DataAssetなどでEditorから参照する際に
このようなコードを作成すると

UPROPERTY(EditDefaultsOnly, DisplayName = "敵のアセット")
TSubclassOf<AActor> EnemyAsset;

プロジェクト内すべてのActorがリストアップされてしまい、
検索が大変
設定するアセットを間違える等のミスが考えられます。

これを解消するために
特定のインターフェイスを継承しているクラスのみがリストアップされるようにしたいと思います。

調べると以下のAllowedClasses metaが候補に上がりますがこちらは自作のC++のクラスなどは検知されないようです。(UE5.3)
Unreal側で用意されているクラスをフィルタリングしたいのならこちらを使えば良さそうですね。

meta = (AllowedClasses = "MyClass")

Widget内のListViewなどEntryWidgetClassはUserObjectListEntryを継承した
Widgetのみしか選択できないですね

こちらのソースコードを確認したところ
MustImplement metaが使用されていました。

これを使用して書くと以下のようになりました。
そのままインターフェイスを指定すると
フルパスを指定するように警告ログがでて正常にフィルターされません。
インターフェイスがあるクラスまでのパスを記述する必要があるようです。

UPROPERTY(EditDefaultsOnly, meta = (DisplayName = "敵のアセット", MustImplement = "/Script/TESTProject.MyTest"))
TSubclassOf<AActor> EnemyAsset;

これで結果がフィルタリングされて
見やすくなりますね。
積極的に活用していきたいところです。