Unity XR集成场景中所有对象随头部移动旋转故障如何解决
问题根因定位
你遇到的场景对象同步跟随头部运动的核心问题出在代码里的transform.position = hit.point;这一行:
- 该代码修改的是脚本挂载对象的坐标,如果你的脚本不小心挂载到了XRRig、Camera Offset或者主相机的父节点上,每次射线检测到地面就会直接修改XR相机组的全局坐标,视觉上就会呈现所有场景对象都在跟随头部移动的相对运动效果,并不是场景对象真的在位移。
修复步骤
- 第一步:先确认脚本挂载位置,把该脚本从所有XR相关节点(XRRig、主相机、Camera Offset)上移除,只挂载到你需要跟随射线碰撞点移动的独立业务对象上。如果你没有需要移动的业务对象,只是要测试Debug射线,直接删除
transform.position = hit.point;这行代码即可。 - 第二步:修正代码里的语法与逻辑错误,修改后的参考代码如下:
public GameObject ground; public Transform lookCamera; void Update() { // 兼容lookCamera未赋值的情况,自动取主相机 Transform camera = lookCamera != null ? lookCamera : Camera.main.transform; Ray ray; RaycastHit[] hits; GameObject hitObject; Debug.DrawRay(camera.position,camera.rotation * Vector3.forward * 100.0f); ray = new Ray(camera.position, camera.rotation * Vector3.forward); // 原代码误用Physics.Raycast,返回所有碰撞结果要用RaycastAll hits = Physics.RaycastAll(ray); for (int i=0; i<hits.Length; i++) { RaycastHit hit = hits[i]; hitObject = hit.collider.gameObject; if (hitObject == ground) { // 修正Debug.Log语法、ToString大小写错误 Debug.Log("Hit (x,y,z): " + hit.point.ToString("F2")); // 仅当你需要移动当前脚本挂载的对象时保留下面这行,否则直接删除 // transform.position = hit.point; } } }
验证排查方法
- 运行时观察Hierarchy面板中XRRig节点的坐标数值,如果坐标在持续变动,即可确认是脚本挂载错误导致XR相机组被移动
- 临时注释掉
transform.position = hit.point;后运行,如果场景对象不再跟随头部移动,即可完全确认问题来源
内容的提问来源于stack exchange,提问作者Muadzir Aziz
相关产品推荐
相关产品推荐

