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

Godot 4.2.1中无法同时实现玩家移动与相机旋转的问题求助

解决方案

问题核心是事件驱动的鼠标旋转与物理移动的执行时机冲突,以下是几种直接可行的修复方案:

方案1:改用Polling方式处理鼠标旋转

将鼠标旋转逻辑从_unhandled_input移到_process中,通过Input.get_mouse_delta()获取鼠标位移,这种方式更稳定,不会和物理移动逻辑互相干扰:

修改后的头部转向代码

func _unhandled_input(event: InputEvent) -> void:
    # 仅处理鼠标模式切换
    if event is InputEventMouseButton:
        Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
        event.accept()
    elif event.is_action_pressed("ui_cancel"):
        Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
        event.accept()

func _process(delta: float) -> void:
    if Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
        var mouse_delta = Input.get_mouse_delta()
        # 玩家绕Y轴实现左右转向
        rotate_y(-mouse_delta.x * 0.006)
        # 相机绕X轴实现上下抬头
        camera.rotate_x(-mouse_delta.y * 0.006)
        # 限制上下视角范围
        camera.rotation.x = clamp(camera.rotation.x, deg_to_rad(-30), deg_to_rad(60))

移动代码保持不变即可,此时鼠标旋转和移动逻辑分别在_process和_physics_process中独立执行,不会出现互斥问题。

方案2:确保节点层级正确

检查你的节点结构,必须保证相机和neck节点是玩家CharacterBody3D的子节点,层级如下:

  • Player (CharacterBody3D)
    • Neck (Node3D)
      • Camera (Camera3D)

这样玩家绕Y轴旋转时,neck的变换会同步更新,移动时基于neck.transform.basis计算的方向才会和玩家转向一致。

方案3:排查输入映射冲突

确认你的输入映射无冲突:

  • left绑定A键、right绑定D键、up绑定W键、down绑定S键
  • ui_accept绑定空格键(跳跃)、ui_cancel绑定Esc键(释放鼠标)

若有其他动作占用这些按键,会导致移动或跳跃功能异常。

验证步骤

  1. 优先测试方案1,这是解决事件冲突最直接的方法
  2. 确认节点层级符合要求,避免因层级错误导致方向计算失效
  3. 检查输入映射,排除按键冲突问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:05:01