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

Unity开发VR游戏:如何限制XR Origin移动范围?

XR Origin移动区域限制解决方案(适配XR Toolkit传送+连续移动)

针对你使用XR Toolkit的XR Origin,同时启用传送系统和基于动作的连续移动的场景,之前的方案无效是因为没找对XR Origin的移动主体和逻辑时机,以下是几个可行的解决办法:

方案1:正确配置Character Controller(适配连续移动)

  • 不要给主摄像机添加Character Controller,而是将其挂载到XR Origin的根GameObject上——XR Origin的根对象才是整个玩家移动的主体,主摄像机只是子对象跟随视角
  • 调整Character Controller参数:
    • 设置合适的Radius和Height,匹配玩家的碰撞范围
    • 修正Center偏移,让碰撞体覆盖玩家的实际移动区域
  • 在场景中创建边界碰撞体(如Box Collider),设置为非触发器,并分配独立层(比如"Bounds"层)
  • 确保XR Origin上的Character Controller Driver组件(无则添加)绑定了根对象的Character Controller,这样连续移动时会自动触发碰撞检测,阻挡玩家超出边界

方案2:自定义脚本限制位置+传送验证(同时适配连续移动和传送)

连续移动位置限制脚本

创建脚本挂载到XR Origin根对象上,在LateUpdate中修正位置(XR的移动更新逻辑在普通Update之后,LateUpdate能确保覆盖移动后的位置):

using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;

public class XROriginBoundsRestrict : MonoBehaviour
{
    // 定义允许的移动区域
    public Bounds allowedArea;

    private XROrigin _xrOrigin;

    void Awake()
    {
        _xrOrigin = GetComponent<XROrigin>();
    }

    void LateUpdate()
    {
        if (_xrOrigin == null) return;
        
        Vector3 currentPos = _xrOrigin.transform.position;
        // 将位置限制在允许区域内,保留Y轴高度(避免影响地面贴合)
        Vector3 clampedPos = allowedArea.ClosestPoint(currentPos);
        clampedPos.y = currentPos.y;
        
        _xrOrigin.transform.position = clampedPos;
    }
}

在Inspector面板中设置allowedArea的中心和大小,对应你的可用游戏区域。

传送位置验证

要限制传送的目标位置,需要拦截传送请求并做区域校验:

using UnityEngine.XR.Interaction.Toolkit;

public class RestrictedTeleportation : MonoBehaviour
{
    public Bounds allowedArea;
    private TeleportationProvider _teleportProvider;

    void Awake()
    {
        _teleportProvider = GetComponent<TeleportationProvider>();
        _teleportProvider.teleportationRequested += OnTeleportRequested;
    }

    void OnTeleportRequested(TeleportationRequest request)
    {
        // 检查目标位置是否在允许区域内,不在则清空请求取消传送
        if (!allowedArea.Contains(request.destinationPosition))
        {
            request = new TeleportationRequest();
        }
    }

    void OnDestroy()
    {
        if (_teleportProvider != null)
        {
            _teleportProvider.teleportationRequested -= OnTeleportRequested;
        }
    }
}

将该脚本挂载到Teleportation Provider所在的对象上,同步设置好允许区域即可。

方案3:利用XR Toolkit原生组件做区域限制

  • 在可用区域创建Teleportation Area组件,勾选Allow Teleportation
  • 在区域外创建Teleportation Area并取消Allow Teleportation,或者用碰撞体阻挡传送射线的检测范围
  • 配合方案1的Character Controller配置,连续移动时会被边界碰撞体阻挡,传送时只能在允许的Teleportation Area内生效

内容的提问来源于stack exchange,提问作者Ryo Akita

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:33:20