文章目录
- 手部设置
- 物体交互
- 物体抓取
- 添加抓取
- 抓取三种类型
- 抓取点偏移
- 抓取事件
- 抓取时不让物体吸附到手部
- 射线抓取
- 交互层级
手部设置
为手部(LeftHandController)添加XRDirInteractor脚本
并添加一个球形碰撞盒,勾选isTrigger,调整大小为0.1
物体交互
创建一个cube当桌子,再创建一个cube当交互物体,交互cube建议大小为0.1
创建三个材质球,将交互物体的材质改为红色
为交互物体添加刚体,
为交互物体添加一个XRSimpleInteractable脚本,注意不需要拖拽Colliders
然后如下设置交互事件,在事件上右键可以复制粘贴
此时运行,手碰到cube会变成绿色,按下抓取键会变成换色,手离开cube会重新变红
物体抓取
添加抓取
创建一个新cube,添加刚体,添加XR Grab Interactable组件,不需要拖拽colliders属性
取消勾选retain Transform Parent,这会让物体在结束抓取时重新返回原来的父物体下,到那时如果父物体的缩放xyz值不同,会导致模型顶点选择错误
此时运行即可抓取
抓取三种类型
VelocityTracking:不能穿过桌子,使用碰撞盒进行物理交互
Kinematic:可以穿过桌子,使用碰撞盒进行物理交互
Instantaneous:可以穿过桌子,使用碰撞盒进行物理交互,但是会不精确
抓取点偏移
创建一个空物体作为抓取对象的子物体,然后放在合适的抓取点上,将空物体拖拽给XRGrabInteractable上的AttachTransform上
抓取事件
可以通过在XRGrabInteractor脚本直接拖拽的方式绑定事件
也可以使用脚本绑定,例如
public class FireBulletOnActivate : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
//被抓取物体的交互组件
XRGrabInteractable grabable = GetComponent<XRGrabInteractable>();
grabable.activated.AddListener(FireBullet);
}
public void FireBullet(ActivateEventArgs arg)
{
print("射击");
}
}
抓取时不让物体吸附到手部
对于interaction Toolkit2.1以上的版本,可以直接勾选Use Dynamic Attach
对于旧版本,我们可以自己重写抓取脚本,将抓取点放到手上,即可实现不吸附的效果
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;
public class XROffsetGrabInteractable : XRGrabInteractable
{
private void Start()
{
if (!attachTransform)
{
GameObject attachPoint = new GameObject("Offset Grab Pivot");
attachPoint.transform.SetParent(transform,false);
attachTransform = attachPoint.transform;
}
}
protected override void OnSelectEntered(SelectEnterEventArgs args)
{
print("进入");
attachTransform.position = args.interactorObject.transform.position;
attachTransform.rotation = args.interactorObject.transform.rotation;
base.OnSelectEntered(args);
}
}
直接挂载,不需要其他操作
射线抓取
就是普通的射线,默认就可以进行抓取操作
右键XR/RayInteractor(Action-base),然后设置好XRController组件的预制数据,对准需要抓取的物体,按下抓取键即可进行抓取
射线抓取和手部的XR Direct Interactor同时使用会造成可以抓两次的错误
如果将射线的XR Interactor Line Visual的颜色透明度改为0,那么将只在只想可抓取物体时,才会显示射线
如果取消勾选射线的XR Ray Interactor组件上的ForceGrab,那么抓取时将保持射线的距离
抓取时可以用摇杆控制旋转和远近
交互层级
射线本身是多功能的,既可以用来移动也可以用来抓取
但是我们希望有些射线只能用来移动,有些只能用来抓取
可以使用分层功能
注意,不是Unity本身的layer,而是interaction toolkit自己的layer
使用方法
找到手上的XR Direct Interactor 或者射线的XR Ray Interactor,选择层级,点开,添加新层级,然后设置
为需要交互的物体找到各自的层级设置,如地面,可抓取物体等,设置好要响应的层级,此时他们将只响应对应层级的交互器