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

Unity相机跟随异常:卡在玩家左侧,需调整至玩家身后

解决Unity相机固定在玩家左侧而非身后的问题

你的代码存在两个核心问题,导致相机始终停在玩家左侧:

  1. 初始偏移量的计算逻辑错误:直接用世界空间的位置差计算offset,当玩家初始朝向不是正前方时,偏移量会包含左右方向的分量,后续位置更新未处理该分量,导致相机偏左无法修正。
  2. 位置更新时忽略了左右方向的偏移:仅基于forward和up方向计算位置,没有处理right方向的偏移,无法调整相机的左右位置。

修改后的代码方案

using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    public GameObject target;
    public float speed = 5f;
    // 直接在Inspector面板设置相对于玩家的本地偏移,示例值对应玩家身后3单位、上方1.5单位
    public Vector3 localOffset = new Vector3(0, 1.5f, -3f);

    void LateUpdate()
    {
        // 将本地偏移转换为世界空间位置,确保相机始终保持相对玩家的位置
        Vector3 targetPosition = target.transform.TransformPoint(localOffset);
        // 平滑移动到目标位置
        transform.position = Vector3.Lerp(transform.position, targetPosition, speed * Time.deltaTime);

        // 让相机始终看向玩家(若需要相机与玩家同步Y轴旋转,可替换为下方注释的旋转逻辑)
        transform.LookAt(target.transform.position);
        
        // 同步玩家Y轴旋转的替代逻辑:
        // Quaternion targetRotation = Quaternion.Euler(transform.rotation.eulerAngles.x, target.transform.rotation.eulerAngles.y, transform.rotation.eulerAngles.z);
        // transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, speed * Time.deltaTime);
    }
}

关键修改说明

  • 可控的本地偏移:通过localOffset直接定义相机相对于玩家的位置,比如(0,1.5f,-3f)清晰对应“身后、上方”的位置,无需复杂计算。
  • 空间转换逻辑:使用TransformPoint将本地空间偏移转换为世界空间位置,确保玩家旋转时,相机始终保持相对位置不变。
  • 简化旋转逻辑:用LookAt确保相机始终对准玩家;若需要相机随玩家转身同步旋转,可切换为注释中的Y轴同步代码。

保留初始位置偏移的替代方案

如果想基于游戏启动时相机与玩家的初始相对位置自动设置偏移,可添加Start方法:

void Start()
{
    // 将初始世界空间的位置差转换为玩家本地空间的偏移
    localOffset = target.transform.InverseTransformVector(transform.position - target.transform.position);
}

内容的提问来源于stack exchange,提问作者Oh Yeah Yeah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:38:15