有时候在程序运行到某个节点的时候需要对操作人员进行友好反馈
尤其是vr制作。如果没有反馈会造成操作人员不知道程序进行到哪里了
所以我们在编写过程中需要有一个反馈给操作人员。轻微震动就是一个很好的反馈
接下来我们就来编写如何调动手柄震动
- 首先,在项目中导入steamvr的插件
- 然后把[CameraRig] 拖到场景中
- 新建一个ShockController,并且应用到右手柄上(任意手柄)
- ShockController的代码如下
using UnityEngine;
using System.Collections;
public class ShockController : MonoBehaviour
{
[Tooltip("震动时长(毫秒)")]
public ushort shockTime=500;
private bool toShockDevice;
SteamVR_TrackedObject Hand;
SteamVR_Controller.Device device
{
get {return SteamVR_Controller.Input((int)Hand.index); }//根据index,获得手柄
}
bool IsShock = false; //布尔型变量IsShock
// Use this for initialization
void Start()
{
Hand = GetComponent<SteamVR_TrackedObject>(); //获得SteamVR_ TrackedObject组件
}
// Update is called once per frame
void Update()
{
updateDo();
//==========================================调用实例
if (Input.GetKeyDown(KeyCode.L))
{
shockDevice();
}
//==========================================调用实例
}
//外部直接调用这个方法一次就可震动
public void shockDevice()
{
toShockDevice = true;
}
//开始震动
private void ShockingDevice()
{
toShockDevice = false;
IsShock = false; //每次按下,IsShock为false,才能保证手柄震动
StartCoroutine("Shock", 0.5f); //开启协程Shock(),第二个参数0.5f 即为协程Shock()的形参
}
private void updateDo()
{
//防止Start函数没加载成功,保证SteamVR_ TrackedObject组件获取成功!
if (Hand.isValid)
{
Hand = GetComponent<SteamVR_TrackedObject>();
}
if (toShockDevice)
{
ShockingDevice();
}
}
//定义了一个协程
IEnumerator Shock(float durationTime)
{
//Invoke函数,表示durationTime秒后,执行StopShock函数;
Invoke("StopShock", durationTime);
//协程一直使得手柄产生震动,直到布尔型变量IsShock为false;
while (!IsShock)
{
device.TriggerHapticPulse(shockTime);
yield return new WaitForEndOfFrame();
}
}
void StopShock()
{
IsShock = true; //关闭手柄的震动
}
}
运行程序按L键就可震动。快快尝试吧。
参考 http://blog.csdn.net/yezhenxu1992/article/details/52293555