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

Godot如何实现玩家角色平滑旋转?现有脚本旋转功能失效求助

旋转功能失效问题排查与修复

核心问题点

  • 旋转逻辑的目标角度变量_target_angle仅声明未赋值,你已经通过turn_input.angle()计算出了输入对应的朝向角度,但完全没有将该值赋给_target_angle,导致角度差计算使用无效值,旋转逻辑无法正常运行
  • 缺少无输入判断:当玩家没有按下任何移动按键时,不需要执行旋转逻辑,否则会出现无操作时角色乱转的问题
  • 移动逻辑冗余且不符合KinematicBody使用规范:你已经通过turn_input拿到了完整的输入向量,不需要额外写大量if/else判断按键组合生成移动向量;直接修改global_transform位置会绕开KinematicBody自带的碰撞检测,你定义的moveSpeed参数也完全没有被用到

修正后完整代码

extends KinematicBody

var moveSpeed : float = 5.0
var jumpForce : float = 10.0
var gravity : float = 20
var vel : Vector3 = Vector3()
const _angular_speed:float = TAU
    
func _physics_process(delta):
    vel.x = 0
    vel.z = 0
    
    var turn_input := Vector2(
            Input.get_action_strength("move_left") - Input.get_action_strength("move_right"),
            Input.get_action_strength("move_forward") - Input.get_action_strength("move_backward")
    )
    # 只有有移动输入时才执行旋转逻辑
    if turn_input.length() > 0:
        var input_angle := turn_input.angle()
        var _target_angle:float = input_angle
        var angle_diff := wrapf(_target_angle - rotation.y, -PI, PI)
        rotation.y += clamp(delta * _angular_speed, 0, abs(angle_diff)) * sign(angle_diff)
        # 简化移动逻辑,直接通过输入向量生成移动方向
        vel.x = turn_input.x * moveSpeed
        vel.z = turn_input.y * moveSpeed
    vel.y -= gravity * delta
    
    if Input.is_action_pressed("jump") and is_on_floor():
        vel.y = jumpForce
    
    vel = move_and_slide(vel, Vector3.UP)

补充说明

如果你需要角色移动方向和自身朝向绑定,只需要将生成vel的部分改成用transform.basis把本地坐标转成全局坐标即可:

var input_dir = Vector3(turn_input.x, 0, turn_input.y).normalized()
vel = transform.basis * input_dir * moveSpeed

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:06:02