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

如何在Godot中实现Sprite的点击拖拽移动系统?

Godot实现Sprite点击拖拽功能方案

核心实现步骤(适配Godot 3.x)

  1. 先配置Sprite节点:在属性面板找到Mouse Filter,设置为Stop,确保节点能接收鼠标事件。
  2. 给Sprite挂载以下GDScript脚本:
extends Sprite

var is_dragging = false
var drag_offset = Vector2.ZERO

func _input_event(viewport, event, shape_idx):
    # 监听鼠标左键按下/抬起事件
    if event is InputEventMouseButton and event.button_index == BUTTON_LEFT:
        if event.pressed:
            # 记录点击点与Sprite原点的偏移量,避免拖拽时Sprite跳转到鼠标中心
            drag_offset = global_position - get_global_mouse_position()
            is_dragging = true
        else:
            is_dragging = false

func _process(delta):
    if is_dragging:
        # 根据鼠标实时位置+偏移量更新Sprite全局坐标
        global_position = get_global_mouse_position() + drag_offset

Godot 4.x适配调整

Godot 4.x中Sprite改名为Sprite2D,鼠标按钮枚举也有变化,脚本修改为:

extends Sprite2D

var is_dragging = false
var drag_offset = Vector2.ZERO

func _input_event(viewport, event, shape_idx):
    if event is InputEventMouseButton and event.button_index == MouseButton.LEFT:
        if event.pressed:
            drag_offset = global_position - get_global_mouse_position()
            is_dragging = true
        else:
            is_dragging = false

func _process(delta):
    if is_dragging:
        global_position = get_global_mouse_position() + drag_offset

关键注意事项

  • 若Sprite位于CanvasLayer节点下,需确认鼠标坐标与CanvasLayer的视图坐标系匹配,必要时改用get_local_mouse_position()结合父节点坐标计算。
  • 若拖拽时出现卡顿,可将_process替换为_physics_process,利用物理帧更新保证移动流畅性。

内容的提问来源于stack exchange,提问作者Kazuala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:00:54