Unity XR Interaction Toolkit(三)拾取物体

首先配置一个可拾取的物体,右键->XR->Grab Interactable,就会创建一个0.1尺寸的小立方体

XRGrabInteractable:

Distance Calculation Mode:根据模式选择坐标点,可以选择Transform的坐标或者碰撞器的坐标

Select Mode:抓取方式,分为单手和双手,在变换脚本挂载时,会根据这个脚本激活

Movement Type:

        Velocity Tracking:通过设置刚体力移动,也就是说可以被物体遮挡,也会影响其他物体

        Kinematic:移动刚体,但是是运动学,自身不受碰撞影响,会影响其他物体

        Instantaneous:通过设置transform的坐标移动,不会触发物理机制

Attach Transform:依附点,为空的时候,会以物体中心为坐标。当不为空时,会贴合手柄的坐标和旋转角度

一、XR Interaction Toolkit代码拾取

手动添加到手柄拾取中

首先,我们需要在代码中获取这个被拾取的物体

IXRSelectInteractable(也就是XRGrabInteractable),还需要获取抓着他的交互器

IXRSelectInteractor(可以是DirectInteractor或RayInteractor,详细看上篇)。

IXRSelectInteractable很好获取,那么它的交互器怎么获取呢?

XRGrabInteractable grabObject;

void Handle(){
    IXRSelectInteractable interactable = grabObject as XRGrabInteractable;
    // 抓取的一个交互
    IXRSelectInteractor interactor = interactable.interactorsSelecting[0];
}

手动拾取代码,以下代码添加的抓取,会被真实手柄放开时丢弃。但是不能丢弃对真实手柄抓取的物体(有点鸡肋),如果执行时会有警告Debug。

XRGrabInteractable grabObject;

void Handle(){
    IXRSelectInteractable interactable = grabObject as XRGrabInteractable;
    // 抓取的一个交互
    XRBaseInteractor interactor = (XRBaseInteractor)interactable.interactorsSelecting[0];

    // 抓取
    interactor.StartManualInteraction(interactable);
    // 丢弃
    interactor.EndManualInteraction(interactable);
}

那么如何才能移除手中抓取的物体呢?

XRGrabInteractable grabObject;

void DropGrabObject(){
    XRInteractionManager manager = FindObjectType<XRInteractionManager>();

    IXRSelectInteractable interactable = grabObject as XRGrabInteractable;
    // 抓取的一个交互
    XRBaseInteractor interactor = (XRBaseInteractor)interactable.interactorsSelecting[0];
    
    // 丢弃
    manager.SelectExit(interactor, interactable);
    // 抓取
    manager.SelectEnter(interactor, interactable);
}

二、单手拾取

改变交互框架下,物体根据手柄的移动产生逻辑,可以制作拉门,摇杆,按钮等功能

了解XRGrabInteractable的运行机制

打开文件可以看到,一个ProcessInteractable函数

在这里,用swtich分隔开了多个状态,其中当updatePhase值为Dynamic或OnBeforeRender时,会处理物体的位置和角度信息,详细看UpdateTarget函数

在UpdateTarget函数里,通过InvokeGrabTransformersProcess函数获取一个ref的Pose值,然后在下面为Transform赋值,而这个InvokeGrabTransformersProcess函数,则是通过获取挂载物体身上的XRBaseGrabTransformer基类来更改Pose值

所以要写逻辑,只需要写一个Transformer脚本挂在物体身上,基类的Start方法会自动添加到XRGrabInteractable中,注意不要覆盖Start

下面是默认状态下的Transformer,没有挂载Transformer时会自动添加这个

如果要自定义移动方法,可以更改UpdateTarget里的内容

三、双手拾取

在单手拾取的基础上,获取第二只手柄的信息

grabInteractable.interactorsSelecting[1]

用来制作双手放大,双手旋转的功能

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值