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

使用VRIF包:触摸控制器松开抓取后让GameObject返回初始位置与旋转

实现VRIF抓取物体超出距离后复位到初始状态

核心思路

给每个可抓取物体添加自定义脚本,记录其初始位置与旋转,在物体被松开时,判断它与抓取点的距离是否超过阈值,若超过则重置回初始状态。

实现步骤与代码

  1. 创建自定义脚本ResetOnRelease.cs,挂载到所有需要该功能的Grabbable物体上:
using UnityEngine;
using VRIF;

public class ResetOnRelease : MonoBehaviour
{
    // 允许的最大松开距离,可在Inspector中调整
    public float maxReleaseDistance = 2f;
    
    private Vector3 _initialPosition;
    private Quaternion _initialRotation;
    private Grabbable _grabbable;
    private Grabber _lastGrabber;

    void Awake()
    {
        // 记录物体初始状态
        _initialPosition = transform.position;
        _initialRotation = transform.rotation;
        
        // 获取VRIF的Grabbable组件
        _grabbable = GetComponent<Grabbable>();
        if (_grabbable == null)
        {
            Debug.LogError("ResetOnRelease requires a Grabbable component on the same GameObject!");
            enabled = false;
            return;
        }
        
        // 订阅抓取和松开事件
        _grabbable.OnGrab.AddListener(OnGrab);
        _grabbable.OnRelease.AddListener(OnRelease);
    }

    void OnGrab(Grabber grabber)
    {
        // 记录最后抓取该物体的Grabber(即玩家手部)
        _lastGrabber = grabber;
    }

    void OnRelease(Grabber grabber)
    {
        if (_lastGrabber == null) return;
        
        // 计算松开时物体与手部的距离
        float distance = Vector3.Distance(transform.position, _lastGrabber.transform.position);
        
        // 超过阈值则复位
        if (distance > maxReleaseDistance)
        {
            transform.position = _initialPosition;
            transform.rotation = _initialRotation;
            
            // 可选:重置物体的速度,避免复位后还带着之前的动量
            Rigidbody rb = GetComponent<Rigidbody>();
            if (rb != null)
            {
                rb.velocity = Vector3.zero;
                rb.angularVelocity = Vector3.zero;
            }
        }
    }

    void OnDestroy()
    {
        // 取消事件订阅,避免内存泄漏
        if (_grabbable != null)
        {
            _grabbable.OnGrab.RemoveListener(OnGrab);
            _grabbable.OnRelease.RemoveListener(OnRelease);
        }
    }
}
  1. 配置参数:
  • 在Inspector面板中,给每个挂载了该脚本的物体设置合适的maxReleaseDistance值(比如2米,根据你的VR场景比例调整)。
  • 确保物体已经添加了VRIF的Grabbable组件,并且对应的Grabber组件(玩家手部)配置正确。

注意事项

  • 如果你的VR场景使用了不同的距离基准(比如1单位=1厘米),记得调整maxReleaseDistance的数值。
  • 若物体带有Rigidbody,复位时重置速度可以避免物体复位后继续移动或旋转,提升体验。
  • 该脚本会自动处理多物体的情况,每个物体独立记录自己的初始状态,互不干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:52:16