You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 14:32:27