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

如何实现相机跟随玩家角色后方并随角色旋转同步?

搞定相机随角色旋转保持相对位置的问题

嘿,我一看就知道你卡在哪了——你现在用的camera_offset是固定世界空间的数值,角色(tracker)旋转时这个偏移不会跟着转,自然没法保持在角色后方的相对位置。给你两个实用的修复方案,挑适合你的来:

方案1:让偏移跟着角色旋转走(推荐)

把原来的固定偏移转换成基于tracker局部空间的方向,这样角色转的时候,偏移方向也同步转。修改你的cam_movement方法就行:

private void cam_movement(GameObject tracker, bool tracking)
{
    // 把局部空间的偏移转成世界空间(跟着tracker的旋转走)
    Vector3 rotatedOffset = tracker.transform.TransformDirection(camera_offset);
    // 用转换后的偏移计算目标位置,平滑移动
    transform.position = Vector3.Lerp(transform.position, tracker.transform.position + rotatedOffset, follow_speed * Time.deltaTime);
}

小提醒:

  • 你在Inspector里设的camera_offset得是相对于tracker局部空间的数值哦!比如想让相机在角色后方2米、上方1米,就设成(0, 1, -2)(默认Z轴是角色前方)。
  • 如果之前的偏移是世界空间的,你可以在Start()里加一行camera_offset = transform.position - tracker.transform.position,这样自动得到局部空间的正确偏移,不用手动算。

方案2:直接把子对象安排上(更简单)

如果不需要太复杂的平滑延迟,直接把相机拖成tracker的子对象,然后在Inspector里调相机的局部位置和旋转——这样角色转的时候相机自动跟着保持相对位置!要是还想要平滑效果,就在这个基础上加层Lerp:

// 假设相机已经是tracker的子对象,加平滑逻辑
public Vector3 localCameraOffset; // 在Inspector设局部偏移
public float rotationSpeed = 5f;

private void cam_movement(GameObject tracker, bool tracking)
{
    // 把局部偏移转成世界位置
    Vector3 targetPos = tracker.transform.TransformPoint(localCameraOffset);
    transform.position = Vector3.Lerp(transform.position, targetPos, follow_speed * Time.deltaTime);
    // 要是需要同步旋转,也可以加这句
    transform.rotation = Quaternion.Lerp(transform.rotation, tracker.transform.rotation, rotationSpeed * Time.deltaTime);
}

为啥原来的代码不好使?

原来的代码里tracker.transform.position + camera_offset是直接把世界空间的偏移怼到tracker的位置上,tracker转了,偏移方向却没变,相机当然就跑歪了。而TransformDirection或者TransformPoint会把局部空间的向量转换成跟着tracker旋转的世界空间向量,完美解决这个问题~

内容的提问来源于stack exchange,提问作者no one

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:13:41