C#实现MainCamera仅沿X轴跟随玩家的技术求助
解决MainCamera仅沿X轴跟随玩家的问题
你遇到的问题很典型:当把相机设为玩家子物体后,相机的Transform会完全继承玩家的所有轴移动,导致你的自定义代码被父物体的移动覆盖,无法生效。这里有个简单且能保留平滑无抖动优势的解决思路,不需要移除子物体关系,只需要锁定相机的Y、Z轴位置即可。
具体实现步骤
- 保持MainCamera作为玩家的子物体不变,这样X轴的跟随会天然继承玩家的平滑移动特性。
- 创建一个C#脚本(比如命名为
LockCameraXFollow.cs),挂载到MainCamera上,通过LateUpdate()方法重置相机的Y和Z坐标,只保留X轴跟随:
- 创建一个C#脚本(比如命名为
using UnityEngine; public class LockCameraXFollow : MonoBehaviour { // 可在Inspector面板设置相机固定的Y、Z偏移值,保持视角高度和距离 public Vector3 fixedAxisOffset; private void LateUpdate() { // 仅继承父物体(玩家)的X轴位置,Y、Z轴使用预设的固定值 Vector3 targetPos = new Vector3( transform.parent.position.x, fixedAxisOffset.y, fixedAxisOffset.z ); transform.position = targetPos; } }
- 在Unity编辑器中,先把相机调整到你想要的固定视角高度和距离,然后将此时相机的Y、Z坐标值填入脚本的
fixedAxisOffset参数中,这样相机就会一直保持这个视角,仅跟随玩家的X轴移动。
- 在Unity编辑器中,先把相机调整到你想要的固定视角高度和距离,然后将此时相机的Y、Z坐标值填入脚本的
为什么用LateUpdate?
LateUpdate()会在所有Update方法执行完毕后运行,确保玩家的移动逻辑已经完成,此时再调整相机位置,不会出现帧同步导致的微小抖动,完美契合子物体天然平滑的优势。
替代方案(无需子物体关系)
如果之后你想移除子物体绑定,也可以用平滑插值的方式实现仅X轴跟随,代码示例如下:
using UnityEngine; public class CameraXOnlyFollow : MonoBehaviour { public Transform playerTarget; public float smoothFollowSpeed = 0.15f; public float fixedYPos; public float fixedZPos; private void LateUpdate() { Vector3 desiredPos = new Vector3( playerTarget.position.x, fixedYPos, fixedZPos ); // 用插值实现平滑移动,调整smoothFollowSpeed控制跟随灵敏度 transform.position = Vector3.Lerp(transform.position, desiredPos, smoothFollowSpeed); } }
不过这种方式需要手动调整平滑速度参数,相比子物体的天然平滑,还是第一种方案更省心。
内容的提问来源于stack exchange,提问作者Anghelina Guznac
相关产品推荐
相关产品推荐

