求助:如何在Godot 4中实现带Spring Arm的传统第三人称相机?
Godot 4 带Spring Arm的第三人称环绕相机实现
节点层级确认
先确保你的节点结构符合以下逻辑(玩家根节点以CharacterBody3D为例):
- CharacterBody3D(玩家节点)
- CollisionShape3D
- SpringArm3D
- Camera3D
核心控制代码
将以下代码附加到SpringArm3D节点上:
extends SpringArm3D # 相机旋转灵敏度 @export var mouse_sensitivity: float = 0.15 # 上下旋转角度限制(避免相机翻转) @export var min_pitch: float = -80.0 @export var max_pitch: float = 80.0 # 存储相机旋转角度 var yaw: float = 0.0 var pitch: float = 0.0 func _ready(): # 锁定鼠标到窗口并隐藏光标 Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) func _input(event: InputEvent): # 按ESC切换鼠标锁定状态 if event is InputEventKey and event.keycode == KEY_ESCAPE: Input.set_mouse_mode( Input.MOUSE_MODE_VISIBLE if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED else Input.MOUSE_MODE_CAPTURED ) func _physics_process(delta: float): if Input.get_mouse_mode() != Input.MOUSE_MODE_CAPTURED: return # 获取鼠标移动输入 var mouse_delta = Input.get_last_mouse_speed() yaw -= mouse_delta.x * mouse_sensitivity pitch += mouse_delta.y * mouse_sensitivity # 限制上下旋转范围 pitch = clamp(pitch, min_pitch, max_pitch) # 将旋转应用到SpringArm rotation_degrees = Vector3(pitch, yaw, 0.0) # 让SpringArm始终跟随玩家位置 global_position = get_parent().global_position
关键设置说明
- SpringArm属性调整:在检查器中设置
Length(相机与玩家的距离),勾选Use Collision防止相机穿墙,调整Collision Mask匹配场景中的碰撞体层级。 - Camera设置:勾选
Camera3D的Current属性,将其设为当前激活相机。 - 手感微调:根据需求修改
mouse_sensitivity参数,数值越大旋转反应越灵敏。
额外提示
- 若需要相机移动更平滑,可以用
lerp函数对global_position的赋值做缓动处理。 - 如果要让相机旋转与玩家移动方向关联,只需调整代码中
yaw的更新逻辑即可。
内容的提问来源于stack exchange,提问作者Coding_Guy
相关产品推荐
相关产品推荐

