Unity相机跟随异常:卡在玩家左侧,需调整至玩家身后
解决Unity相机固定在玩家左侧而非身后的问题
你的代码存在两个核心问题,导致相机始终停在玩家左侧:
- 初始偏移量的计算逻辑错误:直接用世界空间的位置差计算
offset,当玩家初始朝向不是正前方时,偏移量会包含左右方向的分量,后续位置更新未处理该分量,导致相机偏左无法修正。 - 位置更新时忽略了左右方向的偏移:仅基于
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
相关产品推荐
相关产品推荐

