为何添加ColorRect后Area2D的输入事件失效?
Area2D点击事件添加ColorRect后失效的原因与解决方法
初始场景结构
root └ Node2D └ Area2D ├ Sprite └ CollisionShape2D
初始Area2D.gd脚本
extends Area2D func _ready(): var b = self.connect("input_event", self, "_on_Area2D_input_event") print($"../..".print_tree_pretty()) func _on_Area2D_input_event(viewport, event, shape_idx): if InputEventMouseButton and event.is_pressed(): print("Click")
此时点击Sprite可正常打印"Click"。
修改后的场景结构
root └ Node2D ├ ColorRect # 背景 └ Area2D ├ Sprite └ CollisionShape2D
修改后点击Sprite不再打印"Click",事件失效。
原因
ColorRect节点默认的mouse_filter属性为Stop,会拦截所有落在自身区域的鼠标输入事件。由于ColorRect与Area2D是同级节点,鼠标点击事件会被ColorRect优先接收并消耗,导致Area2D无法触发input_event信号。
解决方法
方法一:设置ColorRect忽略鼠标输入
选中编辑器中的ColorRect节点,在Inspector面板找到Mouse Filter选项,将其修改为Ignore。这样ColorRect不会拦截任何鼠标事件,Area2D就能正常接收点击信号。
方法二:修正脚本逻辑漏洞(可选)
原脚本的判断条件存在逻辑问题:if InputEventMouseButton and event.is_pressed() 直接判断类型常量会永远返回true,正确写法应为判断事件类型:
func _on_Area2D_input_event(viewport, event, shape_idx): if event is InputEventMouseButton and event.is_pressed(): print("Click")
额外检查
确保Area2D的Monitorable属性处于开启状态(默认开启),该属性控制Area2D是否能被检测到输入事件。
内容的提问来源于stack exchange,提问作者Garfild
相关产品推荐
相关产品推荐

