【Steam VR 2.0】6.Interactable和Throwable 物体交互 抓 丢 按一下拾取再按一下放下 ,AttachmentFlags介绍

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

 

1.基础的interactable与Throwable

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

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

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

【Steam VR 2.0】6.Interactable和Throwable 物体交互 抓 丢 按一下拾取再按一下放下 ,AttachmentFlags介绍_第1张图片

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

例如Interactable的

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

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

 

Throwable

【Steam VR 2.0】6.Interactable和Throwable 物体交互 抓 丢 按一下拾取再按一下放下 ,AttachmentFlags介绍_第2张图片

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

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

 

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

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

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

 

【Steam VR 2.0】6.Interactable和Throwable 物体交互 抓 丢 按一下拾取再按一下放下 ,AttachmentFlags介绍_第3张图片

 

我们需要的情况是:

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

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

 

分析Throwable的代码发现

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

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

using UnityEngine;
using Valve.VR;
using Valve.VR.InteractionSystem;

public class GunThrowable : Throwable
{
    //你抓取武器所使用的Action
    public 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

【Steam VR 2.0】6.Interactable和Throwable 物体交互 抓 丢 按一下拾取再按一下放下 ,AttachmentFlags介绍_第4张图片

先看一下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动作的方块

【Steam VR 2.0】6.Interactable和Throwable 物体交互 抓 丢 按一下拾取再按一下放下 ,AttachmentFlags介绍_第5张图片

 

若选Nothing:

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

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

DetachOthers :

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

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

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

TurnOnKinematic :

TurnOnGravity:抓取时关闭重力

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

 

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

至少勾选:

SnapOnAttach ,VelocityMovement或者ParentToHand

不要勾选:

TurnOnKinematic

 

 

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

勾选:

TurnOnKinematic

和基础的抓取功能

SnapOnAttach ,VelocityMovement或者ParentToHand

 

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

 

 

 

 

-

你可能感兴趣的:(VR,Unity)