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

SteamVR场景中VR手持设备目标表面吸附异常求助

VR设备表面吸附功能修复方案

问题描述

在SteamVR场景中需实现以下功能:

  • 手中设备靠近目标物体时触发吸附
  • 吸附后可在目标表面横向移动
  • 禁止设备穿透表面

当前存在的问题:

  • 吸附触发后设备位置偏移错误
  • 已添加碰撞体但仍出现穿透现象

修复后的脚本

using UnityEngine;

public class SnapToSurface : MonoBehaviour
{
    public bool ShouldSnap = false;
    // 绑定VR手柄的Transform组件
    public Transform HandToTrack;
    // 要吸附的目标表面碰撞体
    public Collider SurfaceToSnapTo;
    // 触发吸附的距离阈值
    public float snapDistance = 0.1f;
    // 设备的刚体组件
    public Rigidbody rb;
    // 设备与表面的偏移高度(避免紧贴导致穿模)
    public float snapHeightOffset = 0.01f;
    // 射线检测长度(略大于吸附距离)
    public float raycastLength = 0.15f;

    private void Update()
    {
        if (!ShouldSnap)
        {
            // 未开启吸附时恢复物理交互
            if (rb.isKinematic)
                rb.isKinematic = false;
            return;
        }

        // 从手柄位置向前发射射线,检测目标表面
        Ray ray = new Ray(HandToTrack.position, HandToTrack.forward);
        if (Physics.Raycast(ray, out RaycastHit hit, raycastLength))
        {
            // 确认检测到的是目标表面
            if (hit.collider == SurfaceToSnapTo)
            {
                // 计算吸附位置:接触点 + 表面法向量 × 偏移高度
                Vector3 snapPosition = hit.point + hit.normal * snapHeightOffset;
                transform.position = snapPosition;

                // 保持设备与手柄的旋转一致
                transform.rotation = HandToTrack.rotation;

                // 开启运动学刚体,避免物理碰撞干扰吸附效果
                if (!rb.isKinematic)
                    rb.isKinematic = true;
                return;
            }
        }

        // 未检测到有效表面时,恢复物理交互
        if (rb.isKinematic)
            rb.isKinematic = false;
    }
}

关键修改说明

  • 修正偏移方向:原脚本使用目标物体的全局Up方向作为偏移,改为使用射线检测到的表面法向量,确保设备始终贴合表面的正确位置
  • 替换检测方式:用射线检测替代ClosestPoint方法,避免选中物体背面或不合理的接触点,更准确匹配手柄指向的表面区域
  • 解决穿透问题:通过射线检测确保设备始终处于表面上方偏移位置;同时开启运动学刚体后,可在Unity编辑器中设置设备与表面的碰撞层级,避免相互穿透
  • 简化逻辑流程:调整判断顺序,先处理未开启吸附的情况,再执行射线检测,代码更清晰易维护

使用注意事项

  1. 确保VR手柄的HandToTrack已正确绑定
  2. 目标表面的SurfaceToSnapTo需添加Mesh Collider(复杂表面需勾选Convex选项)
  3. 设备的Rigidbody组件需开启Use Gravity,未吸附时可正常下落
  4. 根据场景尺寸调整snapDistance和raycastLength参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:55:59