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
相关产品推荐
相关产品推荐

