Godot 4中如何检测Area2D区域的鼠标点击事件?
在Area2D里检测鼠标点击和事件的正确姿势
先说结论:完全没必要用_process(delta),Godot给Area2D提供了更高效的专用方法,不用每帧轮询浪费性能。
首选方法:用_input_event回调
Area2D自带_input_event函数,只要有鼠标事件(点击、移动这类)落在节点范围内,就会自动触发。直接在脚本里写这个函数就行:
extends Area2D # 注意:要确保Area2D的「Monitorable」属性是开的(默认就是开的) # 还有关联的CollisionShape2D的「Pickable」也要开着 func _input_event(viewport, event, shape_idx): # 检测鼠标左键按下事件 if event is InputEventMouseButton and event.button_index == BUTTON_LEFT and event.pressed: print("点到这个Area2D啦") # 要是想检测鼠标移动、右键点击,改对应的判断条件就行
另一种方式:连接信号
你也可以在编辑器里给Area2D连信号,比如input_event(和上面的回调效果一样)、mouse_entered(鼠标进区域触发)、mouse_exited(鼠标离开触发)。如果想用代码连信号,示例如下:
extends Area2D func _ready(): # 把input_event信号绑到自定义处理函数上 connect("input_event", self, "_handle_input_event") # 可选:绑定鼠标进出的信号 connect("mouse_entered", self, "_on_mouse_in") connect("mouse_exited", self, "_on_mouse_out") func _handle_input_event(viewport, event, shape_idx): if event is InputEventMouseButton and event.button_index == BUTTON_LEFT and event.pressed: print("点到Area2D了") func _on_mouse_in(): print("鼠标进到区域里了") func _on_mouse_out(): print("鼠标离开区域了")
如果你非要用_process的写法(不推荐)
要是坚持想用你给的那种每帧检测的方式,就得自己判断鼠标位置和输入状态,代码大概是这样:
extends Area2D var mouse_touching = false func _process(delta): # 把鼠标全局坐标转成节点本地坐标 var mouse_local_pos = to_local(get_global_mouse_position()) # 检查鼠标是否在碰撞形状范围内 mouse_touching = get_node("CollisionShape2D").shape.has_point(mouse_local_pos) # 检测鼠标左键是否按下 var mouse_left_down = Input.is_mouse_button_pressed(BUTTON_LEFT) if mouse_touching and mouse_left_down: print("clicked on object")
这种方法每帧都要做坐标转换和碰撞检测,性能不如前两种,除非特殊需求,不然不建议用。
内容的提问来源于stack exchange,提问作者Coding_Guy
相关产品推荐
相关产品推荐

