【HTC-VIVE】10-Sample Interactable:简单交互实现

简单交互场景:

传送点,桌子,小球,提示Canvas与文字


SampleInteractable.png

Interactable 脚本:

可以交互得物体上要添加得脚本组件,用于手柄与之交互。


Interactable.png
  • 可设置的属性:
  • Activeate Action Set On Attach : 在附着物体时激活的事件集

  • Hide Hand On Attach : 在附着物体时,隐藏整个手,包括手柄与手的模型,分离时显示
  • Hide Skeleton On Attach :在附着物体时,只隐藏手模型,不包括手柄,分离时显示
  • Hide Controller On Attach : 在附着物体时,只隐藏手柄,不包括手模型,分离时显示

  • Hand Animation On Pickup : 在捡东西时,播放的手的动画
  • Set Range Of Motion On Pickup : 在捡起东西时,在骨骼上设置运动变化
  • Use Hand Object Attachment Point : 指定使用手的附着物体的位置点,还是直接使用手的位置作为挂载点

  • Hand Follow Transform : 想要手附着在某物上,并跟随其移动,指定该位置
  • Hand Follow Transform Position : 手跟随物体的位置移动
  • Hand Follow Transform Rotation : 手跟随物体的旋转进行旋转
  • Highlight On Hover : 可交互物体,在被手悬停触碰时,是否 外发光 高亮显示

  • Hide Highlight : 一些子物体,不高亮显示,例如:透明物体,VFX特效等

可访问的属性或方法:
  • attached To Hand : 获取该交互物体附着的手(返回 Hand)
  • isDestroying : 只读,获取该交互物体是否销毁中(返回 bool)
  • isHovering :只读,获取该交互物体是否被手悬停触碰状态中(返回 bool)
  • wasHovering : 只读,获取该交互物体是否被手悬停触碰(返回bool)


Sample Interactable 脚本:

1、该脚本是自定义脚本,可以在内部处理相关交互事件

2、内部这些方法的调用,都是Hand 脚步通过 SendMessage()方式来调用,因此内部的方法名必须与Hand中的名称一致,并且都有Hand类型参数传递,不要求都(声明)有接受者。

例如Hand脚本中:

Hand.png


在可交互的,附着的物体上可以处理的消息有:
  • OnHandHoverBegin( Hand hand ) : -----当手开始悬停在可交互物体上,被调用一次
  • OnHandHoverEnd( Hand hand ) : -----当手结束悬停在可交互物体上,被调用一次
  • HandHoverUpdate( Hand hand ) : -----当手一直悬停在可交互物体上,被每帧调用

  • OnAttachedToHand( Hand hand ) : -----当可交互物体刚被手抓取附着时,被调用一次
  • OnDetachedFromHand( Hand hand ) : -----当可交互物体刚被手释放分离时,被调用一次
  • HandAttachedUpdate( Hand hand ) : -----当可交互物体刚被手一直抓取附着时,被每帧调用

  • OnHandFocusAcquired( Hand hand ): -----当附加的GameObject成为主要附加对象时调用调用一次(就是说附加了很多物体到附加物栈中,到该物体成为栈顶时,调用一次)
  • OnHandFocusLost( Hand hand ) : ----当这个主要附加GameObject不再是栈顶对象时调用一次

SampleInteractable:

using UnityEngine;
using Valve.VR.InteractionSystem;

/// <summary>
/// 简单的交互
/// </summary>
public class SampleInteractable : MonoBehaviour {

    private TextMesh textMesh;//显示文字,输出状态

    private Vector3 oldPosition; //记录原来的位置,在分离时回到原来的位置。
    private Quaternion oldRotation;//记录原来的旋转,在分离时回到原来的旋转角度

    private float attachTime; //被抓取附着的时间

    //附着的类型标志
    private Hand.AttachmentFlags attachmentFlags = Hand.defaultAttachmentFlags & (~Hand.AttachmentFlags.SnapOnAttach) & (~Hand.AttachmentFlags.DetachOthers) & (~Hand.AttachmentFlags.VelocityMovement);

    //可交互对象
    private Interactable interactable;

    //-------------------------------------------------
    void Awake()
    {
        textMesh = GetComponentInChildren<TextMesh>();
        textMesh.text = "无手柄悬停!";

        interactable = this.GetComponent<Interactable>();
    }



    //-------------------------------------------------
    // 当手开始悬停在可交互物体上,被调用一次
    //-------------------------------------------------
    private void OnHandHoverBegin(Hand hand)
    {
        textMesh.text = "正在悬停的手柄: " + hand.name;
    }


    //-------------------------------------------------
    // 当手结束悬停在可交互物体上,被调用一次
    //-------------------------------------------------
    private void OnHandHoverEnd(Hand hand)
    {
        textMesh.text = "无手柄悬停!";
    }


    //-------------------------------------------------
    // 当手一直悬停在可交互物体上,被每帧调用
    //-------------------------------------------------
    private void HandHoverUpdate(Hand hand)
    {
        GrabTypes startingGrabType = hand.GetGrabStarting(); //获取手柄进行抓取的方式

        bool isGrabEnding = hand.IsGrabEnding(this.gameObject); //获取手柄是否结束抓取

        if (interactable.attachedToHand == null && startingGrabType != GrabTypes.None)
        {
            // 保存位置/旋转,当分离时,以便可以恢复它。
            oldPosition = transform.position;
            oldRotation = transform.rotation;

           
            //锁定该交互物,避免再悬停到其他物体上,保证一次悬停锁定一个可交互的物体
            hand.HoverLock(interactable);

            // 附加该物体到手上
            hand.AttachObject(gameObject, startingGrabType, attachmentFlags);
        }
        else if (isGrabEnding)
        {
            // 从手上分离该物体
            hand.DetachObject(gameObject);

            // 解除对该物体的悬停锁定
            hand.HoverUnlock(interactable);

            // 恢复分离的物体到原来的位置
            transform.position = oldPosition;
            transform.rotation = oldRotation;
        }
    }



    //-------------------------------------------------
    // 当可交互物体刚被手抓取附着时,被调用一次
    //-------------------------------------------------
    private void OnAttachedToHand(Hand hand)
    {
        textMesh.text = "球体附着在:" + hand.name;
        attachTime = Time.time;
    }


    //-------------------------------------------------
    // 当可交互物体刚被手释放分离时,被调用一次
    //-------------------------------------------------
    private void OnDetachedFromHand(Hand hand)
    {
        textMesh.text = "球体从 " + hand.name+" 分离!";
    }



    //-------------------------------------------------
    //当可交互物体刚被手一直抓取附着时,被每帧调用
    //-------------------------------------------------
    private void HandAttachedUpdate(Hand hand)
    {
        textMesh.text = "球体附着在:" + hand.name + "\n附着时间: " + (Time.time - attachTime).ToString("F2");
    }


    //-------------------------------------------------
    // 当附加的GameObject成为主要附加对象时调用调用一次(就是说附加了很多物体到附加物栈中,到该物体成为栈顶时,调用一次)
    //-------------------------------------------------
    private void OnHandFocusAcquired(Hand hand)
    {
    }


    //-------------------------------------------------
    // 当这个主要附加GameObject不再是栈顶对象时调用一次
    //-------------------------------------------------
    private void OnHandFocusLost(Hand hand)
    {
    }

}

注:记住引入命名空间:using Valve.VR.InteractionSystem; 否则无法使用相关的类。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容