Control.mouse_filter
とは、その Control ノードがマウスの入力に対してどう振る舞うのかを決める enum プロパティです。
MOUSE_FILTER_STOP
、MOUSE_FILTER_PASS
、MOUSE_FILTER_IGNORE
の3種がありますが、名前が曖昧でパッと見どういった挙動になるのか分かりづらいです。
とりあえず解説の前に一言で表すと、以下のとおりです。
-
MOUSE_FILTER_STOP
: そのノードでだけ処理して、誰にも渡さない -
MOUSE_FILTER_PASS
: そのノードで処理しつつ、親にも渡す -
MOUSE_FILTER_IGNORE
: 処理しない
解説の前提知識
画面上で複数の Control が重なっている箇所をクリックした場合、「手前にある」ノードが優先されます。
「手前にある」とは、そのノードがツリーのなかでより下に存在するということです(親子のことではなく、並び順のことです)。
MouseFilter は「手前にある」ノードが入力をどう扱うのか、後ろにあるノードは入力を受け取ることができるのか、というところに関わってきます。
本当はイベントハンドリングの話が関わってきますが、ここでは一旦置いておきます。
MOUSE_FILTER_STOP
一言で言うと「そのノードでだけ処理して、誰にも渡さない」です。
「誰にも渡さない」ってどういうこと?となりますが、これは他の2つの挙動を見ると理解できるはずです。
MOUSE_FILTER_PASS
一言で言うと「そのノードで処理しつつ、親にも渡す」です。
はじめに自分で入力を受け取ります。
その後、 accept_event()
を呼んで入力を「処理済み」としなければ、親も入力を受け取ります。
入力を受け取った親でもまた accept_event()
が呼ばれなければ、さらにその親が入力を受け取ることになります。
ただし、親が MOUSE_FILTER_STOP
である場合には「誰にも渡さない」ため、そこから先へは進みません。
このように親には入力が伝播していきますが、無関係な別の Control には伝播しません。
"PASS" という名前だからといって、重なっている後ろのノードに貫通していくわけではないということです。
MOUSE_FILTER_IGNORE
一言で言うと「反応しない」です。
このノードはマウスに対して存在しないかのように振る舞うので、重なっている後ろのノードがマウス入力を受け取ることができます。
ただし、子には影響を及ぼしません。
つまり、例えば MOUSE_FILTER_STOP
に設定されているボタンの親に MOUSE_FILTER_IGNORE
を設定したとしてもボタンをクリックすることができます。
透明な Control が画面を覆い尽くしているような場合、これを設定しないと何も押せなくなるので注意が必要です。
参考文献
Control — Godot Engine (4.x)の日本語のドキュメント
Using InputEvent — Godot Engine (4.x)の日本語のドキュメント