Godot游戏开发中如何定义存储旋转角度的变量实现角色倾斜
核心问题说明
你当前代码有两个直接影响功能的错误:
- 错误修改了
transform.origin属性:这个属性存储的是节点的本地空间位置坐标,和旋转完全无关,修改它只会让上半身节点位置偏移,不会产生倾斜效果。 - 逻辑顺序冲突:原代码先后写了两次独立的插值判断,右倾的插值结果会被后续的左倾判断分支覆盖,导致右倾操作完全失效。
旋转角度的正确存储类型
你用Vector3存储欧拉角旋转值的方式是完全正确的,Godot中旋转相关的常用类型对应场景如下:
- 配置固定旋转角度(比如你导出的默认角度、倾斜角度):用
Vector3即可,三个分量分别对应X/Y/Z三个轴的旋转数值,直接在Inspector面板调整分量值非常方便。 - 运行时修改节点旋转:Spatial节点自带
rotation属性,类型就是Vector3,存储本地空间下的欧拉角旋转值,直接对这个属性做插值就能实现平滑倾斜效果。 - 复杂空间变换计算:如果后续要做骨骼IK、多节点空间联动这类复杂逻辑,可以用
Basis类型存储旋转矩阵,简单的左右倾斜功能不需要用到。
修正后的可用代码
extends Spatial const LEAN_LERP = 5 # 初始值可以根据你的需求在Inspector面板调整 export var default_degrees : Vector3 = Vector3.ZERO export var leaning_degrees : Vector3 = Vector3(0.6, 0, 0) func _process(delta): # 先计算当前输入对应的目标旋转值,避免逻辑覆盖 var target_rotation = default_degrees if Input.is_action_pressed("LeanRight"): target_rotation = leaning_degrees if Input.is_action_pressed("LeanLeft"): target_rotation = -leaning_degrees # 对旋转属性做插值,不要修改position/origin相关属性 rotation = rotation.linear_interpolate(target_rotation, LEAN_LERP * delta)
补充提示:如果运行后发现倾斜幅度过小,注意核对引擎版本的单位差异:Godot 3中rotation属性单位为角度,Godot 4中对应Node3D节点的rotation属性单位为弧度,0.6弧度约等于34度,如果你用Godot 4且觉得倾斜幅度不对,可以按这个换算关系调整leaning_degrees的数值到你觉得手感合适的程度即可。
内容的提问来源于stack exchange,提问作者user18855915
相关产品推荐
相关产品推荐

