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

Area2D节点自身场景正常但主场景无法接收鼠标输入求助

解决Area2D放入主场景后无法接收鼠标输入的问题

核心问题排查与解决要点

  • 必须给Area2D添加碰撞形状:Area2D完全依赖CollisionShape2D或CollisionPolygon2D来触发输入事件,自身场景可能默认带了碰撞形状,但拖入主场景时可能遗漏,或者形状未正确设置。要确保碰撞形状的Shape属性已配置(比如选RectangleShape2D并调整大小),且monitoring、monitorable都处于开启状态(默认是开启的)。
  • 检查Control节点的输入拦截:如果主场景有TextureRect、Panel这类Control节点,即使设置了mouse_filter为MOUSE_FILTER_PASS,也要确认它们没有完全覆盖Area2D的碰撞区域。Control节点默认会消耗输入,建议把覆盖在Area2D上方的Control节点的mouse_filter改成MOUSE_FILTER_IGNORE,彻底避免抢输入。
  • 放弃全局_input函数,改用Area2D专属的input_event:你用了全局的_input函数处理释放和移动事件,主场景中其他节点也可能监听ui_touch事件,会导致事件被提前消耗。Area2D的input_event信号是局部触发的,只在碰撞区域内响应,把所有输入逻辑移到这里更可靠。

修正后的完整代码

extends Area2D

signal vector_created(vector)

export var maximum_length := 200

var touch_down := false
var position_start := Vector2.ZERO
var position_end := Vector2.ZERO
var vector := Vector2.ZERO

func _ready() -> void:
    connect("input_event", self, "_on_input_event")

func _draw() -> void:
    draw_line(position_start - global_position, 
        position_end - global_position, 
        Color.blue, 
        8)
    
    draw_line(position_start - global_position, 
        position_start - global_position + vector, 
        Color.red, 
        16)

func _reset() -> void:
    position_start = Vector2.ZERO
    position_end = Vector2.ZERO
    vector = Vector2.ZERO
    update()

func _on_input_event(viewport, event, shape_idx) -> void:
    # 处理触摸/鼠标按下
    if event.is_action_pressed("ui_touch"):
        touch_down = true
        position_start = event.position
        viewport.set_input_as_handled() # 标记事件已处理,避免其他节点干扰
    
    # 处理触摸/鼠标释放
    elif event.is_action_released("ui_touch"):
        touch_down = false
        emit_signal("vector_created", vector)
        _reset()
        viewport.set_input_as_handled()
    
    # 处理鼠标/触摸移动
    elif touch_down and event is InputEventMouseMotion:
        position_end = event.position
        vector = -(position_end - position_start).clamped(maximum_length)
        update()
        viewport.set_input_as_handled()

额外检查项

  • 确认Area2D的input_pickable属性为true(默认是true,别不小心关掉)
  • 如果主场景用了Camera2D,要保证Area2D在Camera的可视范围内,且Camera的current属性已勾选
  • 可以临时给Area2D加个Sprite节点,可视化它的位置和大小,确保碰撞区域和你预期的一致

内容的提问来源于stack exchange,提问作者Sm-25

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:50:41