Unreal Engine 5で開発する過程で、少しハマったウィジェットに追加した[Button]のクリックイベントを処理するとウィジェット側の[OnMouseButtonUp]イベントが実行されない原因と対処法を備忘録的に投稿します。
UEのOnMouseButtonDown/Upイベント
Unreal Engineのブループリントのイベントグラフでオーバーライドが可能なイベントに[OnMouseButtonDown]と[OnMouseButtonUp]があります。
C#のイベントと少し仕様が違うので知らないと、かなりハマります。
簡単に書くと[OnMouseButtonUp]は事前に[OnMouseButtonDown]で関連付けをして置かないと発火しません。
C#などの場合は、マウスのボタンを押すイベントと離すイベントは独立していて、どんな状況でもマウスのボタンの状態でイベントが発火します。
その関連付けをするのが、[OnMouseButtonDown]の戻り値に[Handled]ノードを設定する作業になります。
[Button]コントロールのイベントに奪われる
今回、ハマったのがこれ。
ボタン[Button]コントロールを追加したウィジェットブループリント。
これを、別のブループリントに追加して、[OnMouseButtonDown]イベントの最中に、このボタンをクリックすると[OnMouseButtonUp]イベントが発火しなくなる現象。
調べてみると、[OnMouseButtonDown]や[OnMouseButtonUp]の関係性以上に、UEの場合、マウスのボタンをクリックした時に、ポインターに一番近いコンポーネントに優先権があるらしい。
つまり画面に対して一番手前のボタンをクリックすると下層のコンポーネントに実装されている[OnMouseButtonDown]や[OnMouseButtonUp]イベントは発火しないらしい。
イベントが発火しない時の対策
対策になっているのか微妙ですが[Button]コントロールを使わないというのが対策です。
こんな感じで[Border]コントロールなどに置き換えて[Button]コントロールは使わない。
追加した[Border]コントロールの[OnMouseButtonDown/Up]イベントであれば、下層のイベントの邪魔をしません。
まとめ
今回は、短い記事ですが、Unreal Engine 5でウィジェットに追加した[Button]のクリックイベントを処理するとウィジェット側の[OnMouseButtonUp]イベントが実行されない原因と対処法について書きました。
UEの[OnMouseButtonUp]と[OnMouseButtonDown]イベントはC#などのマウス関連のイベントと違い、[OnMouseButtonDown]で[Handled]を通知した時だけ[OnMouseButtonUp]イベントが発火する仕組みになっています。
それに加えて、ウィジェットなどで利用した場合にマウスポインターに一番近いコントロールに優先権があるので、コンポーネントの階層によってはイベントを奪われてしまう可能性があります。
対処法としては[Button]コントロールから[Border]コントロールなどクリックイベントを持たないコントロールに置き換えることで、不用意にイベントが奪われるのを回避できる可能性があります。
Unreal Engine で[OnMouseButtonUp]イベントが正しく実行されない人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。



