如何在Godot中实现Sprite的点击拖拽移动系统?
Godot实现Sprite点击拖拽功能方案
核心实现步骤(适配Godot 3.x)
- 先配置Sprite节点:在属性面板找到
Mouse Filter,设置为Stop,确保节点能接收鼠标事件。 - 给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
相关产品推荐
相关产品推荐

