Unity VR传送脚本无法精准传送到指向位置的解决问询
Unity VR 精准传送脚本实现(不破坏视觉效果)
核心问题分析
直接移动XROrigin到射线命中位置时,相机无法精准到达目标点,原因是相机在XROrigin内部存在固定的相对偏移(本地位置),最终相机世界位置 = XROrigin位置 + 相机本地偏移,导致偏离目标。缩小XROrigin的X/Z缩放虽然能降低偏移,但会破坏手部模型的视觉比例和位置。
解决方案代码
以下是可直接在VS中实现的精准传送脚本,无需修改XROrigin缩放:
using UnityEngine; using UnityEngine.XR.Interaction.Toolkit; public class VRTeleport : MonoBehaviour { [SerializeField] private XROrigin xrOrigin; [SerializeField] private XRRayInteractor rayInteractor; [SerializeField] private InputActionReference triggerPress; private Transform cameraTransform; private Vector3 cameraLocalOffset; void Awake() { cameraTransform = xrOrigin.Camera.transform; // 计算相机相对于XROrigin的初始本地偏移(仅初始化时获取,后续头部移动不会改变此相对关系) cameraLocalOffset = xrOrigin.transform.InverseTransformPoint(cameraTransform.position); } void Update() { bool hit = rayInteractor.TryGetHitInfo(out Vector3 hitPosition, out _, out _, out _); bool isTriggerPressed = triggerPress.action.ReadValue<float>() == 1f; if (hit && isTriggerPressed) { // 反推XROrigin需要移动到的位置:命中位置 - 相机本地偏移 // 这样相机最终世界位置 = XROrigin目标位置 + 相机本地偏移 = 命中位置 Vector3 targetOriginPos = hitPosition - cameraLocalOffset; xrOrigin.transform.position = targetOriginPos; } } }
可选调整(针对Y轴需求)
如果需要传送时保持相机的视线高度(不跟随地面Y轴),可以单独锁定Y轴:
// 仅修改X/Z轴,保持XROrigin原有的Y高度,维持相机视线高度 Vector3 targetOriginPos = new Vector3( hitPosition.x - cameraLocalOffset.x, xrOrigin.transform.position.y, hitPosition.z - cameraLocalOffset.z );
对你思路的补充
- 思路1(调整相机初始位置):只能优化默认状态下的偏移,无法应对玩家头部移动后的动态偏移,属于治标不治本的方案。
- 思路2(计算差值调整XROrigin):和上述解决方案逻辑一致,是正确的核心方向,实际测试后即可生效。
内容的提问来源于stack exchange,提问作者NadCat
相关产品推荐
相关产品推荐

