You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:05:16