Unity XR 支持交互(抓取、移动、旋转、传送、射击)
文章目录
前言
Unity XR 提供了 XR 交互工具包,可以直接在包管理器中安装/更新。对于简单的交互需求unity 射线碰撞检测,可以实现0代码贴图笔刷,只需要在句柄和对象上挂载相应的脚本即可。此演示使用最新的 2.1.0 预览版。如果版本较低,某些脚本可能不可用。请尽可能更新到最新版本。
此演示使用 Pico XR SDK。导入SDK后会自带一个0.9版本的XR交互工具包。请从包管理器中更新,否则后面的选项会相差较大。
PS:更新到新版本后,很多脚本提供了新版本的Action-based方法和旧版本的Device-based。本博客将解释基于设备的版本。关于新版Unity输入系统的使用,笔者将在下面讨论。有一篇文章重点介绍它。
一、创建句柄
二、手柄抓取1.XR DirectController直接抓取手柄
2. XR 射线交互器处理射线抓取
手柄射线抓取一般使用默认设置将被击中的物体吸到手柄上,不添加碰撞体。图层蒙版等属性同上,不再赘述。
3.XR Grab 可交互
三、操纵杆控制移动和旋转
以左摇杆控制连续旋转,右摇杆控制连续移动为例
根据上图,在XR Origin上添加Locomotion System、Continous Turn Provider等组件,然后按照上图箭头进行配置。
四、手柄射线传输1.基础版
除了射线手柄的设置外,还需要在地面上添加Teleportation Area脚本才能进行瞬移(如果只想瞬移到固定点,可以使用Anchor,用法同上) ,然后射线会探测到可以传送的地面。变为绿色,默认按下触发键实现瞬移。
2. 高级版
改进
只挂载默认脚本,有时很大程度上不能满足需求。例如,一般控制器的瞬移功能并不总是有曲线来选择位置。我们希望在按下按钮或按下操纵杆时出现曲线旋转位置,在松开按键或操纵杆时发生瞬移等。
负责传输的句柄不能同时挂载Ray Interactor和Direct Interactor。也就是说,我们无法实现handle通常只通过挂载脚本就负责直接抓取,而当我们要传输的时候,就可以得到光线选择位置传输。
对于问题1和2的场景,作者给出了一个解决方案,以左手柄通常负责直接抓取,按A键出现传输光线选择位置为例。
基本思路
创建两个左手柄对象unity 射线碰撞检测,一个安装 Direct Interactor 用于日常抓取,一个安装 Ray Interactor 用于交付。通常Ray Interactor脚本会被禁用,只有当A键被按下时启用位置选择,当A键被释放时,代码控制传送请求的发送,然后禁用脚本指示器等。
关于按下和抬起手柄按钮的Down和Up事件,如果你使用旧的输入系统,可以参考这篇文章。启动和禁用脚本的过程比较简单。以下仅显示按钮解除时的传输请求。代码。
//传送管理器脚本的获取省略
public TeleportationProvider provider;
//负责传送的手柄XRRayInteractor脚本,获取过程省略
public XRRayInteractor teleportRayInteractor;
private void LeftAXButtonUpHandler()
{
//射线信息
RaycastHit rayInfo;
//判断目标点是否有效 1.是否击中目标 2.是否具有Teleportation组件
bool isValid = teleportRayInteractor.TryGetCurrent3DRaycastHit(out rayInfo);
isValid = isValid && rayInfo.collider != null &&
(rayInfo.collider.GetComponent<TeleportationArea>() != null ||
rayInfo.collider.GetComponent<TeleportationAnchor>() != null);
if (isValid)
{
//创建传送需求将射线击中的位置作为目的地,提交到provider中的传送队列。
TeleportRequest request = new TeleportRequest();
request.destinationPosition = rayInfo.point;
provider.QueueTeleportRequest(request);
}
//禁用相关脚本和指示器
teleportRayInteractor.enabled = false;
teleportRayInteractor.GetComponent<XRInteractorLineVisual>().reticle?.SetActive(false);
}
五、手柄控制射击
在VR游戏中,经常会有拿起枪射击的功能,其总体设计难度为
判断物体是否被抓取,哪个手柄抓取了物体以及抓取物体的手柄是否按下了触发键文章来源:https://www.toymoban.com/news/detail-781666.html
XR Grab Interactable脚本中已经贴心地提供了一个事件,触发条件就是上面两个。使用如下文章来源地址https://www.toymoban.com/news/detail-781666.html
private XRGrabInteractable grab;
private void Awake()
{
grab = GetComponent();
//为activated事件添加监听函数即可
grab.activated.AddListener(GrabHandler);
}
private void GrabHandler(ActivateEventArgs a)
{
//当枪械被抓取和按下Trigger后回调此方法,触发射击方法。
Shoot();
}
到了这里,关于Unity XR实现交互(抓取、移动、旋转、传送、射击)-Pico的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!