🐀

【Godot Engine】mouse_filter プロパティについて【GDScript】

2022/07/29に公開

Godot Engine 3.4.4

mouse_filterはControlオブジェクトのプロパティの一つです。
Stopにするとマウス入力イベントは自身で止まります。
Passにすると親ノードにも伝達します。
Ignoreにするとイベントに反応しなくなります。

例えば以下のようなノード構成のシーンがあったとします。
PanelとButtonがControlの子になっている場合です。

Control
--Panel
--Button

そして以下のようにオブジェクトが配置されているとします。

ここではシグナルは以下のように接続しておき、インプットマップ上でclickが左クリックに割り当てられているものとします。

extends Control

func _on_Control_gui_input(event):
	if event.is_action_pressed("click"):
		print("Control Clicked!")

func _on_Panel_gui_input(event):
	if event.is_action_pressed("click"):
		print("Panel Clicked!")

func _on_Button_pressed():
	print("Button Clicked!")

当然ですがButtonをクリックすれば"Button Clicked!"が表示され
Panelをクリックすれば"Panel Clicked!"が表示されます。

ではButtonをクリックした際にイベントをPanelにも伝達させたい場合は
どうしたらよいでしょうか?
Buttonのmouse_filterPassに設定すればよさそうに思えます。
しかし、これだけだとButtonはPanelの子ではないためイベントが伝達されません。
なのでノード構成を以下のように変更します。ButtonをPanelの子にするだけです。

Control
--Panel
----Button

これでうまくいくはずです。

もちろん、Panel側でもPassに設定すれば_on_Control_gui_inputも呼び出されますし
Ignoreに設定すれば_on_Panel_gui_inputは呼び出されません。

参考URL:

https://godotengine.org/qa/79347/mouse-filters-set-to-pass-control-still-blocking-mouse-input
https://docs.godotengine.org/ja/stable/classes/class_control.html#class-control-property-mouse-filter

Discussion