Unity|HTC ViVe 之手柄震动

2024-09-19上海AR开发专家

  • 前言: 最近入坑了Unity,坚信好记性不如烂笔头…… 今天,我决定写一点关于学习HTC ViVe手柄震动的心得。
    步骤一:
    首先,你可以到Asset store 下载
    SteamVR
    Plugin;
    当然你也可以去我的网盘下载 (链接:
    https://pan.baidu.com/s/1sl2AIwX
     密码:zj6n )
    我是不是太过于无私了……哈哈哈 ! (我猜你心里肯定暗骂,傻逼……)
    步骤二:
    新建一个项目,在菜单栏上点击 Assets–>Import Package–>Custom Package,导入SteamVR Plugin.unitypackage资源包;
    步骤三:
    然后,将文件夹SteamVR–>Prefabs–>CameraRig预设体拖拽进入Hierarchy视图中,如下图所示:
    步骤四:新建一个C#脚本,如 yzx_controller.cs,并将脚本拖拽到CameraRig物体下的子物体Controller(right)上,即添加到右手柄上,当然也可以添加到左手柄上。如下图所示:
    yzx_controller.cs的代码如下:
    一、 手柄震动一下(真的只震动一下,也许不注意都感受不到!)
    using UnityEngine;using System.Collections;public class yzx_controller : MonoBehaviour
    {
        SteamVR_TrackedObject Hand;   
        SteamVR_Controller.Device device;    // Use this for initialization
        void Start () {
            Hand = GetComponent();  //获得SteamVR_ TrackedObject组件
        }    // Update is called once per frame
        void Update () {        if (Hand.isValid)
              {             //防止Start函数没加载成功,保证SteamVR_ TrackedObject组件获取成功!
                Hand = GetComponent(); 
              }             //根据index,获得手柄 
             device = SteamVR_Controller.Input((int)Hand.index);            //如果手柄的Trigger键被按下了
            if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger)) 
              {
                Debug.Log("Trigger is pressed!"); //控制台输出Trigger is pressed!
                device.TriggerHapticPulse(500); //手柄震动函数,500代表振幅,是一个ushort类型
              }

        }12345678910111213141516171819202122232425262728293031323334
    运行程序,扣一下Trigger键,咦,好像不对劲,都没感觉发生了什么。也许你会怀疑人生,是不是都没有捕捉到Trigger键被按下的事件?
    No,No,No,明明控制台打印了Trigger is pressed !
    这是为什么?……
    因为,手柄只震动了一下下,你根本感觉不到。当然,你也可以修改这句代码device.TriggerHapticPulse(500); 将参数500调成1000,甚至更大(数值越大,振幅越大), 然而,震感还是太低了,因为,持续时间太短了……
    二、手柄持续震动(这次,真的很有震感了……)
    自然想到,如果要让手柄有震感,那么震动持续的时间一定要有保证!!!
    下面的代码中,你可以随便修改代码StartCoroutine(“Shock”,0.5f) 的第二个参数(代表震动持续时间),0.5f 代表手柄持续震动0.5s,想震多久就震多久……Cool !!!
    我的想法:就是通过协程去执行手柄震动,然后通过Invoke函数来决定延迟时间,即控制手柄震动的持续时间。
    全面修改 yzx_controller.cs脚本,代码如下:
    using UnityEngine;using System.Collections;public class yzx_controller : MonoBehaviour
    {
        SteamVR_TrackedObject Hand;
        SteamVR_Controller.Device device;    bool IsShock = false;  //布尔型变量IsShock

        // Use this for initialization
        void Start ()
        {
            Hand = GetComponent();  //获得SteamVR_ TrackedObject组件  
        }    // Update is called once per frame
        void Update ()
        {      //防止Start函数没加载成功,保证SteamVR_ TrackedObject组件获取成功!
            if (Hand.isValid)
            {
                Hand = GetComponent();
            }     
            device = SteamVR_Controller.Input((int)Hand.index);    //根据index,获得手柄 
                //如果手柄的Trigger键被按下了
            if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))
            {

                IsShock = false;  //每次按下,IsShock为false,才能保证手柄震动
                StartCoroutine("Shock",0.5f); //开启协程Shock(),第二个参数0.5f 即为协程Shock()的形参
            }

        } //定义了一个协程

        IEnumerator Shock(float durationTime) 

        {//Invoke函数,表示durationTime秒后,执行StopShock函数;
            Invoke("StopShock", durationTime);//协程一直使得手柄产生震动,直到布尔型变量IsShock为false;
            while (!IsShock)
            {
                device.TriggerHapticPulse(500);            yield return new WaitForEndOfFrame();

            }
        }    void StopShock()
        {
            IsShock = true; //关闭手柄的震动
        }
    }1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
    运行程序,Amazing!手柄真的真的震动起来了,而且可以随意调节震动的持续时间, So cool ……

关于AR

卓越的技术,一流的团队,为您打造专家级AR产品。
Test your infrastructure

什么是AR?

AR(Augmented Reality),即增强现实技术能将虚拟信息(图片,视频, 音频等)融入现实世界,让现实世界更加多元、丰富,为人们带来更加生动有 趣的感官体验。简单来说AR技术给人们带来的是一种信息的增强体验,它也 将成为一种“更新奇、更易传播”的新型信息传递方式。

AR的趋势

在信息技术化的时代趋势下,AR将以一种新型娱乐及信息交互方式融入人们 的生活,而对于企业来说,AR产品的广泛推广及运用也将是一项不可错失的 绝佳商机。

Test your infrastructure

AR运用的困惑

AR技术备受瞩目,然后实际运用上却让人望而止步。
成本上 往往单制作一个AR形式的内容就得花费上万元, 只有高预算的大企业或广告商才能出手
技术上 AR技术总给人一种触不可及的印象,导入AR技术 是否需要高度技术支持。
企划上 AR充满娱乐性,但是好玩之外,如何将AR良性结 合商务是难题。

选择迅速AR的八大优势

迅速AR始终以满足顾客为己任,成就AR领先品牌。

经典案例展示

我们是AR应用的领军者,专注AR技术研究与开发。

新闻动态 · 与日俱进

我们诚心邀您分享我们的成长历程。
更多动态 >

合作伙伴

整合全球产业链资源,服务超过7亿用户