如何设置Cinemachine第三人称相机:玩家横向移动时相机保持静止
实现《马里奥64》风格的Cinemachine第三人称跟随相机
核心目标是让相机固定在世界空间的某个位置(或仅在玩家超出范围时缓慢移动),仅保持朝向玩家,同时玩家基于相机空间的输入绕相机移动。以下是具体实现步骤:
1. 重构相机的目标绑定
默认Cinemachine第三人称相机的Follow和Look At都绑定玩家,导致相机随玩家平移。修改为:
- 将
Look At保持绑定玩家对象,确保相机始终看向玩家 - 创建一个空GameObject(命名为
CameraAnchor),放置在你希望相机初始固定的位置,将相机的Follow目标改为这个空对象
这样相机的位置会锁定在CameraAnchor的位置,仅通过旋转看向玩家,不会随玩家左右移动而平移。
2. 相机视角控制(可选)
如果需要玩家能像《马里奥64》那样调整相机视角,给CameraAnchor添加旋转控制逻辑:
- 用鼠标输入控制
CameraAnchor的Y轴旋转(水平转向),示例代码:public float mouseSensitivity = 2f; void Update() { float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity; transform.Rotate(0, mouseX, 0); } - 可以添加角度限制,避免相机旋转到不合理的角度(比如限制Y轴旋转在±180°内)
3. 确保玩家移动基于相机空间
既然你已经确认移动脚本在自由视角下正常,只需保持移动输入转换为相机空间方向即可,示例核心逻辑:
// 获取相机的水平方向向量(忽略垂直分量) Vector3 cameraForward = Camera.main.transform.forward; cameraForward.y = 0f; cameraForward.Normalize(); Vector3 cameraRight = Camera.main.transform.right; cameraRight.y = 0f; cameraRight.Normalize(); // 计算玩家移动方向 float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); Vector3 moveDir = cameraForward * vertical + cameraRight * horizontal; // 应用移动(根据你的玩家控制逻辑调整) playerRigidbody.MovePosition(transform.position + moveDir * moveSpeed * Time.deltaTime);
这样玩家的横向输入会驱动角色绕相机位置做圆周移动,而非 Strafing。
4. 可选:添加相机滞后跟随
如果希望玩家移动到一定范围后,相机才缓慢跟进(还原《马里奥64》的相机弹性),给CameraAnchor添加以下脚本:
public Transform player; public float followRadius = 4f; // 玩家超出这个半径时相机开始移动 public float smoothSpeed = 1.5f; public float cameraDistance = 6f; // 相机与玩家的固定距离 void Update() { // 计算相机锚点的目标位置:玩家后方固定距离处 Vector3 desiredPos = player.position - Camera.main.transform.forward * cameraDistance; desiredPos.y = transform.position.y; // 保持相机高度不变 // 检查玩家是否超出跟随半径 float distanceToDesired = Vector3.Distance(transform.position, desiredPos); if (distanceToDesired > followRadius) { transform.position = Vector3.Lerp(transform.position, desiredPos, smoothSpeed * Time.deltaTime); } }
内容的提问来源于stack exchange,提问作者user1958698
相关产品推荐
相关产品推荐

