HTC Vive开发笔记之手柄震动

发表于2017-01-16
评论0 2.1k浏览
  HTC Vive手柄震动是怎么实现的?HTC Vive开发这块的资料不足,导致很多使用人在用Unity开发时会遇到很多问题,为此下面就给大家介绍下HTC Vive手柄震动效果实现教程,一起来看看吧。
  
  步骤一:首先,你可以到Asset store 下载 SteamVR Plugin;
  
  步骤二:新建一个项目,在菜单栏上点击 Assets–>Import Package–>Custom Package,导入SteamVR Plugin.unitypackage资源包;
  
  步骤三:然后,将文件夹SteamVR–>Prefabs–>CameraRig预设体拖拽进入Hierarchy视图中,如下图所示:
  
  步骤四:新建一个C#脚本,如 yzx_controller.cs,并将脚本拖拽到CameraRig物体下的子物体Controller(right)上,即添加到右手柄上,当然也可以添加到左手柄上。如下图所示:
  
  yzx_controller.cs的代码如下:
  
  一、 手柄震动一下
  
  运行程序,会发现手柄只震动了一下下,你根本感觉不到。当然,你也可以修改这句代码device.TriggerHapticPulse(500); 将参数500调成1000,甚至更大(数值越大,振幅越大), 然而,震感还是太低了,因为,持续时间太短了……
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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类型
          }
 
    }

  
  二、手柄持续震动
  
  在下面的代码中,你可以随便修改代码StartCoroutine(“Shock”,0.5f) 的第二个参数(代表震动持续时间),0.5f 代表手柄持续震动0.5s,想震多久就震多久……
  
  通过协程去执行手柄震动,然后通过Invoke函数来决定延迟时间,即控制手柄震动的持续时间。
  
  全面修改 yzx_controller.cs脚本,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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; //关闭手柄的震动
    }
 
 
}

  
  运行程序,你会发现现在真的有震感了,还可以随意调节震动的时间。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引