Godot输入处理技能Skill godot-input-handling

这个技能专注于Godot游戏引擎中的输入处理,提供专家级的模式来管理键盘、鼠标、游戏手柄和触摸输入。它包括使用InputMap定义动作、处理InputEvent、支持控制器连接和切换、实现输入重绑定、设置死区以避免误操作,以及通过输入缓冲提升游戏响应性。适用于游戏开发者设置玩家控制、构建健壮的输入系统或增强游戏的可访问性。关键词:Godot, 输入处理, InputMap, InputEvent, 游戏手柄, 重绑定, 死区, 输入缓冲, 游戏开发。

游戏开发 0 次安装 0 次浏览 更新于 3/23/2026

name: godot-input-handling description: “输入处理的专家模式,涵盖InputMap动作、InputEvent处理、控制器支持、重绑定、死区和输入缓冲。在设置玩家控制、实现输入系统或添加游戏手柄/可访问性功能时使用。关键词:InputMap, InputEvent, 游戏手柄, 控制器, 重绑定, 死区, 输入缓冲。”

输入处理

处理键盘、鼠标、游戏手柄和触摸输入,带有适当的缓冲和可访问性支持。

可用脚本

input_buffer.gd

响应式控制的输入缓冲 - 缓冲动作150毫秒以确保紧密的游戏感。

input_remapper

运行时输入重绑定,带有冲突检测和保存/加载持久性。

强制 - 为了响应式控制:在实现跳跃/冲刺机制之前阅读input_buffer.gd。

输入处理中永不做的事情

  • 永不 在_process()中轮询输入进行游戏动作 — 使用_physics_process()_unhandled_input()_process()依赖于帧率,低FPS时会导致输入丢失。
  • 永不 使用硬编码的按键检查(KEY_W, KEY_SPACE — 使用InputMap动作。硬编码的按键 = 无法重绑定,破坏非QWERTY键盘。
  • 永不 忽略控制器死区 — 摇杆漂移在0.05幅度 = 角色自行行走。始终使用0.15-0.2死区实现Input.get_axis()
  • 永不 假设单一输入设备 — 玩家可能中途切换键盘 → 游戏手柄。监听Input.joy_connection_changed并动态更新UI提示。
  • 永不 使用_input()进行游戏动作_input()触发所有事件(包括UI)。使用_unhandled_input(),只有当UI未消耗事件时才触发。
  • 永不 忘记响应式控制的输入缓冲 — 玩家在落地前50毫秒按下跳跃?没有缓冲,跳跃就丢失了。缓冲输入100-150毫秒以获得紧密的游戏感。

InputMap动作

设置: 项目设置 → 输入映射 → 添加动作

# 检查动作是否在本帧按下
if Input.is_action_just_pressed("jump"):
    jump()

# 检查动作是否被按住
if Input.is_action_pressed("fire"):
    shoot()

# 检查动作是否被释放
if Input.is_action_just_released("jump"):
    release_jump()

# 获取轴(-1到1)
var direction := Input.get_axis("move_left", "move_right")

# 获取向量
var input_vector := Input.get_vector("left", "right", "up", "down")

InputEvent处理

func _input(event: InputEvent) -> void:
    if event is InputEventKey:
        if event.keycode == KEY_ESCAPE and event.pressed:
            pause_game()
    
    if event is InputEventMouseButton:
        if event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
            click_position = event.position

游戏手柄支持

# 检测控制器连接
func _ready() -> void:
    Input.joy_connection_changed.connect(_on_joy_connection_changed)

func _on_joy_connection_changed(device: int, connected: bool) -> void:
    if connected:
        print("控制器 ", device, " 已连接")

参考

相关