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

求助:如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:46:18