【Steam VR 2.0】6.Interactable和Throwable 物体交互 抓 丢 按一下拾取再按一下放下 ,AttachmentFlags介绍 ,强制松手,松手后回到原父物体

本文主要是介绍【Steam VR 2.0】6.Interactable和Throwable 物体交互 抓 丢 按一下拾取再按一下放下 ,AttachmentFlags介绍 ,强制松手,松手后回到原父物体,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

介绍一下插件内置的物体交互

 

1.基础的interactable与Throwable

为你的物体添加合适的碰撞体

添加Interactable组件,默认状态,手柄靠近物体,物体边缘高亮

基于Interactable,再添加Throwable,手柄靠近物体高亮时,再点击抓取或者扳机键,即可拿取物体

其中的一些参数,可以自己尝试使用一下

例如Interactable的

Hide Hand On Attach:当拾取物体后,隐藏“手”的模型

如果你为抓取的物体,制作了Skeleton Pose,那么就要取消勾选这个选项,否则看不见效果

 

Throwable

添加Throwable时,系统会自动添加RigidBody

可以根据需求在下方添加事件

 

2.拾取“枪”及放下“枪”

默认的物体拾取方式是,按下按键时拾取物体,抬起按键时直接松开物体,

然而对于类似射击游戏这种,需要有拾取不同武器的情况,如果一直按着Grib键会非常不舒服,类似枪械的射击,不仅要按住Grib键,还要按Trigger键去射击,同时还要调整角度去瞄准,这样用户体验极差。

 

 

我们需要的情况是:

按一次Grib,抓住枪,并且武器会保持持握状态

在已经抓着枪的情况下,再次点击Grib键,松开武器

 

分析Throwable的代码发现

监听松手的代码内容是在HandAttachedUpdate中实现的,我们只需要控制一下这部分代码的执行时机,即可

我们新建GunThrowable.cs 继承 Throwable.cs

using UnityEngine;
using Valve.VR;
using Valve.VR.InteractionSystem;public class GunThrowable : Throwable
{//你抓取武器所使用的Actionpublic SteamVR_Action_Boolean GunGrabAction;//标记,当前是否抓着武器private bool isGrabbing = false;//抓取次数的标志位,private int GrabCount = 0;//当前抓着枪的手private Hand currentHand;//当手触碰到枪时protected override void OnAttachedToHand(Hand hand) {//保留父类内容base.OnAttachedToHand(hand);//获取当前手currentHand = hand;Debug.Log("Attach");}protected override void OnDetachedFromHand(Hand hand) {base.OnDetachedFromHand(hand);//清空当前手hand = null;Debug.Log("Detach");}protected override void HandAttachedUpdate(Hand hand) {if (isGrabbing) {//父类,松手的代码base.HandAttachedUpdate(hand);isGrabbing = false;}}public void Update() {//只有当前,碰到物体时if (interactable.attachedToHand) {//检测,你拾取物体Actin的抬起事件if (GunGrabAction.GetStateUp(currentHand.handType)) {Debug.Log("-----");//Count>1 当前已经抓取到物体if (GrabCount >= 1) {isGrabbing = true;GrabCount = 0;}//Grab count = 0, 当前未抓取物体else {GrabCount++;}}}}}

将GunThrowable代替Throwable挂到你的物体上即可

 

3.AttachmentFlags

先看一下Hand里的源码

public enum AttachmentFlags
{SnapOnAttach = 1 << 0, // 在按下抓取键的瞬间,待抓取物的位置会根据当前手柄位置跳到被抓取状态 The object should snap to the position of the specified attachment point on the hand.DetachOthers = 1 << 1, // Other objects attached to this hand will be detached.DetachFromOtherHand = 1 << 2, // 当左手抓着物体时,右手也来抓物体,那么左手会自动松手 This object will be detached from the other hand.ParentToHand = 1 << 3, // 抓取后,变成手的子物体 The object will be parented to the hand.VelocityMovement = 1 << 4, // The object will attempt to move to match the position and rotation of the hand.TurnOnKinematic = 1 << 5, // The object will not respond to external physics.TurnOffGravity = 1 << 6, // 自动关闭重力 The object will not respond to external physics.AllowSidegrade = 1 << 7, // The object is able to switch from a pinch grab to a grip grab. Decreases likelyhood of a good throw but also decreases likelyhood of accidental drop
};public const AttachmentFlags defaultAttachmentFlags = AttachmentFlags.ParentToHand |AttachmentFlags.DetachOthers |AttachmentFlags.DetachFromOtherHand |AttachmentFlags.TurnOnKinematic |AttachmentFlags.SnapOnAttach;

AttachmentFlags是用来标记,标记一些抓取装态。

例如一个手抓住时,另一个手是否可以抢走。或者抓住物体时,是否需要与场景中物体碰撞。等等

 

下面以Throwable为例,介绍下如何使用AttachmentFlag的各项内容,示例抓取物选用自带例子中带有Skeleton动作的方块

 

若选Nothing:

那么Interacctable的内容依然有效,触碰物体会有高亮,但抓取时,物体不会跟着手移动,并且上另一个手时,会出现两个手同时抓住物体的状态。

SnapOnAttach :抓取的瞬间,调整抓取物位置,以适应手柄状态

DetachOthers :

DetachFromOtherHand :一只手抓取时,另一只手也要抓取同一个物体时,原手自动松开

ParentToHand :抓取时,抓取物变成手的子物体

VelocityMovement :待抓取物,尝试移动到手的位置(可理解为跟随,可与物体碰撞)

TurnOnKinematic :

TurnOnGravity:抓取时关闭重力

AllowSidegrade :该物体能够从捏切换到握。减少good throw的可能性,但也降低了意外脱手的可能性

 

1.抓取物体,并物体可以与参与碰撞

至少勾选:

SnapOnAttach ,VelocityMovement或者ParentToHand

不要勾选:

TurnOnKinematic

 

 

2.抓取物体,并且不参与碰撞

勾选:

TurnOnKinematic

和基础的抓取功能

SnapOnAttach ,VelocityMovement或者ParentToHand

 

3.其他各种组合功能,勾选相应选项即可

 

在其他一些自定义脚本中,也可以自行定义这些抓取功能

 

4.使用代码抓取物体与强制松手

SteamVR中Hand.cs中有抓取物体与松手的代码

 

使用代码抓取物体

hand.cs中

public void AttachObject(GameObject objectToAttach, GrabTypes grabbedWithType, AttachmentFlags flags = defaultAttachmentFlags, Transform attachmentOffset = null)

==详细讲解待补充==

 

强制松手

hand.cs中:

DetachObject(GameObject objectToDetach, bool restoreOriginalParent = true)

直接使用hand.DetachObject() 即可

第一个参数为需要松开的物体,一般可以使用hand.currentAttachedObject来获取到手抓到的物体

所以你的强制松手代码可能如下

if(你需要松手的逻辑){Hand hand=player.instance.righthand;//以右手为例hand.DetachObject(hand.currentAttachedObject);//强制松开当前抓到的东西
}

第二个参数,如果你的抓取物AttachedObject有父物体,并且记录到了AttachedObject的originalParent中,那么此参数传入true后,松手后,AttachedObject会回到原父物体的子级

 

 

5.松手时,使当前松开的物体,回到其原来的父物体下

========20210225更新=========

先说功能,实现它,只需要勾选Throwable的Restore Original Parent即可。

同时需要注意的是,这个可抓取物要有父物体,否则无效。(在你的主场景,建立一个位置归零的空物体作为父物体,存放可抓取物即可)

这么做的原因:

除了字面意思,我就希望松手返回父物体之外,还有一种情况可能导致bug

 

可能出现的bug如下:

首先,插件里的Player预制体是DontDestoryOnLoad的,并且,如果你的游戏有很多场景,例如菜单场景A,和主场景B,

当你在主场景B中,使用预制的Player抓取了一个物体,那么这个物体也会被强制放入到DontDestoryOnLoad场景中,如果不勾选这个选项,

在你想要离开主场景B返回主菜单A时,刚刚抓取的物体,会被强制带到菜单场景A中,导致逻辑混乱。

 

若勾选这个回到原父物体的选项,抓取物就会在更换场景时,被正确销毁。

 

 

 

 

 

 

 

 

 

 

 

 

这篇关于【Steam VR 2.0】6.Interactable和Throwable 物体交互 抓 丢 按一下拾取再按一下放下 ,AttachmentFlags介绍 ,强制松手,松手后回到原父物体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/322475

相关文章

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

Mysql BLOB类型介绍

BLOB类型的字段用于存储二进制数据 在MySQL中,BLOB类型,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储的大小不同。 TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

nginx介绍及常用功能

什么是nginx nginx跟Apache一样,是一个web服务器(网站服务器),通过HTTP协议提供各种网络服务。 Apache:重量级的,不支持高并发的服务器。在Apache上运行数以万计的并发访问,会导致服务器消耗大量内存。操作系统对其进行进程或线程间的切换也消耗了大量的CPU资源,导致HTTP请求的平均响应速度降低。这些都决定了Apache不可能成为高性能WEB服务器  nginx:

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给