HOME / 第 6 部分 · 数据与进阶开发 / 第 77 课
MODULE 6 · 数据与进阶开发

第 77 课 · 输入进阶:手柄与触摸

⏱ 预计时长 35 分钟📊 难度 进阶📚 模块 第 6 部分 · 数据与进阶开发

🎯 本课学习目标

电脑游戏用键盘鼠标,但手柄与触屏是移动端/主机的必备。本课扩展输入能力。

📖 详细教学步骤

手柄输入映射操作

  1. 项目设置 → 输入映射
  2. 给动作添加事件 → 选「手柄按钮(Joypad Button)」或「手柄轴(Joypad Axis)」
  3. 手柄插上后在输入窗口按对应键即可绑定
  4. 轴(摇杆)用于模拟量控制(如行走速度)

💡 常用映射:A=跳跃、十字键=移动、RB=攻击。

读取摇杆(模拟量)代码

摇杆返回 -1 到 1 的连续值:

GDSCRIPTfunc _physics_process(delta):
    # 读取左摇杆 XY 轴
    var joy_x = Input.get_joy_axis(0, JOY_AXIS_LEFT_X)
    var joy_y = Input.get_joy_axis(0, JOY_AXIS_LEFT_Y)
    var dir = Vector2(joy_x, joy_y)
    # 死区处理:避免摇杆不回中
    if dir.length() < 0.2:
        dir = Vector2.ZERO
    else:
        dir = dir.normalized()
    velocity = dir * speed
    move_and_slide()

震动反馈代码

受击/爆炸时手柄震动:

GDSCRIPTfunc rumble(strength: float = 0.5, duration: float = 0.3):
    Input.start_joy_vibration(0, strength, strength, duration)

触摸输入代码

移动端:手指触摸控制(虚拟摇杆/按钮):

GDSCRIPTfunc _unhandled_input(event):
    if event is InputEventScreenTouch:
        if event.pressed:
            print("手指按下位置:", event.position)
        else:
            print("手指抬起")
    if event is InputEventScreenDrag:
        print("手指拖动:", event.position)

虚拟摇杆 UI实操

移动端常见控制:屏幕左侧虚拟摇杆。

  1. 做 TouchScreenButton 或自绘虚拟摇杆
  2. 拖动时把偏移量转成方向向量
  3. 把方向传给角色移动

💡 Godot 有 VirtualJoystick 插件可搜;先理解原理即可。

统一输入处理(重要)重点

别在代码里写死键盘,统一用动作名:

GDSCRIPT# 键盘/手柄都映射到同一动作,代码只读动作
if Input.is_action_just_pressed("jump"):
    jump()

# 这样键盘(空格)和手柄(A)都能跳跃,无需改代码

组合输入进阶

组合键(Shift+攻击=重击):

GDSCRIPTfunc _process(delta):
    if Input.is_action_pressed("attack") and Input.is_action_pressed("sprint"):
        heavy_attack()
    elif Input.is_action_just_pressed("attack"):
        normal_attack()
⚠️
手柄没反应?

确认手柄已连接、输入映射已绑定、用了正确的轴/按钮常量。

⚠️
摇杆不动但角色乱动?

摇杆死区太小导致漂移。设置死区(< 0.2 归零)。

🧪 动手试一试

🏋️ 课后练习

给平台跳跃游戏加手柄支持:A 跳跃、摇杆移动(带死区),受击时手柄震动 0.3 秒。

输入映射加手柄事件 + 摇杆死区 + start_joy_vibration。

💡

坚持「动作名」抽象输入,一份代码兼容键鼠/手柄/触屏。

💡

摇杆死区 0.1-0.2 是常见标准,按手感调。

🎓 本课小结

输入进阶:手柄映射 + 摇杆模拟量(死区)+ 震动反馈;触摸事件与虚拟摇杆适配移动端;统一用动作名实现多设备兼容。