如何让物体跟随相机旋转 实现FPS游戏俯看时可见角色身体的效果
实现FPS身体跟随相机且俯看可见的解决方案
问题根因
你当前的代码将身体的三轴旋转完全和相机绑定,当相机向下俯仰(绕X轴旋转)时,身体模型会同步向下倾斜,要么直接移出相机视锥体范围,要么和相机近裁剪面重合被裁剪,因此俯看时看不到身体。
核心修改思路
- 位置同步时增加向下的偏移量,保证身体默认在相机下方的视野范围内
- 旋转仅同步水平方向(Y轴,左右转向的旋转),不同步俯仰方向(X轴,上下看的旋转),保证身体始终保持竖直站立状态
修改后代码
把原来的Update替换成下面的逻辑即可:
// 可在Inspector面板调整的偏移量,根据你的角色模型高度调整 public float bodyVerticalOffset = 1.5f; private void Update() { // 位置同步:相机位置向下偏移,保证身体在相机下方 transform.position = arCamera.transform.position - arCamera.transform.up * bodyVerticalOffset; // 旋转同步:仅保留Y轴(水平转向)的旋转,丢弃X轴俯仰、Z轴翻滚的旋转 transform.rotation = Quaternion.Euler(0, arCamera.transform.rotation.eulerAngles.y, 0); }
可选优化方案
如果你的玩法需要身体跟随相机有轻微的俯仰动作,可以限制俯仰角度的最大值,避免身体完全朝下:
public float bodyVerticalOffset = 1.5f; // 最大俯仰角度,可自行调整,比如最多向下转30度 public float maxPitchAngle = 30f; private void Update() { transform.position = arCamera.transform.position - arCamera.transform.up * bodyVerticalOffset; // 拿到相机的三轴角度 Vector3 cameraEuler = arCamera.transform.rotation.eulerAngles; // 处理俯仰角度,限制在 -maxPitchAngle 到 maxPitchAngle 范围内 float pitch = cameraEuler.x > 180 ? cameraEuler.x - 360 : cameraEuler.x; pitch = Mathf.Clamp(pitch, -maxPitchAngle, maxPitchAngle); // 赋值旋转 transform.rotation = Quaternion.Euler(pitch, cameraEuler.y, 0); }
注意事项
- 调整
bodyVerticalOffset时要避免模型太靠近相机,被相机近裁剪面裁剪 - 确认身体模型的Layer没有被相机的Culling Mask排除
内容的提问来源于stack exchange,提问作者wldwkdrn thl
相关产品推荐
相关产品推荐

