首先配置一个可拾取的物体,右键->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]文章来源:https://www.toymoban.com/news/detail-715093.html
用来制作双手放大,双手旋转的功能文章来源地址https://www.toymoban.com/news/detail-715093.html
到了这里,关于Unity XR Interaction Toolkit(三)拾取物体的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!