【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;

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

UE5.3.2 Cook時に Profile (OverlapAll) – Custom Channel Name = ‘GameTraceChannelN’ hasn’t been found ログが出る

Cookした際に

以下の警告が出たときの対応
PackagingResults: Warning: Profile (OverlapAll) - Custom Channel Name = 'GameTraceChannelN' hasn't been found
(Nには6~18の数字が入る可能性がある?)

Config/DefaultEngine.iniを開いて
以下の部分を編集する

+EditProfiles=(Name="OverlapAll"~
から始まる行の警告ログに出ている
Channel="GameTraceChannelN" になっている部分を
Channel="HOGEHOGE" のように自分で設定した名前に変更
OverlapAll以外もログが出ていたら同様に変更する。

本来ならばProjectSettingで設定したときに自動で正しいものに変更されるはずだが何らかの原因でうまく動作しなくなってしまっている。
原因不明
Engine側が管理しているDefaultEngine.iniの部分を直接書き換えるのはあんまり良くなさそう