如何实现相机跟随玩家角色后方并随角色旋转同步?
搞定相机随角色旋转保持相对位置的问题
嘿,我一看就知道你卡在哪了——你现在用的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
相关产品推荐
相关产品推荐

