ViveFocus使用WaveVR插件获取手柄操作事件

  • 此文的诞生
  • 一、插件必备WaveVR
  • 二、场景中放置必要的预制件
  • 三、代码获取手柄交互事件
  • 结束语


此文的诞生

入职新公司,接手旧项目,程序猿不可避免的麻烦。不巧,在下正是被一个旧VR项目卡在了怎么获取手柄事件上。网上找了很多资料,基本没有,可能是因为ViveFocus这款单手柄的设备销量不太行的原因吧。今天就把方法告诉大家,省的大家跟我走一样的弯路。

android BLE 手柄 原理 安卓手柄插件_android BLE 手柄 原理


单手柄设备

android BLE 手柄 原理 安卓手柄插件_vr_02

一、插件必备WaveVR

这个WaveVR插件啊,Unity商城就有免费版,直接下载导入即可,在这里提一下的原因是,有很多人喜欢荡网盘资源,我想说的是像这种常用插件,大家最好还是先去Unity商城和PakageManager下找找有没有,有的话就用Unity自身的毕竟版本最好,最优。

(你要说你的Unity版本不支持那么高的版本,我想说那就另当别论了,只是建议)

android BLE 手柄 原理 安卓手柄插件_android_03


下面开始正题

二、场景中放置必要的预制件

android BLE 手柄 原理 安卓手柄插件_sed_04


第一步,场景中放置必要的预制件这五个缺一不可。

WaveVR—确保VR视角

ControllerLoader—VR基础控制器(比如惯用手调整等)

InputModuleManager—射线检测控制管理器

ButtonManager—手柄按钮生效管理

android BLE 手柄 原理 安卓手柄插件_android_05


WaveVRButtons—手柄按钮配置列表

android BLE 手柄 原理 安卓手柄插件_sed_06

三、代码获取手柄交互事件

做完上面的准备工作,正题这就来了:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using wvr;//命名空间必须的

public class GamePanel : MonoBehaviour
{
	Text showText;
    CanvasGroup group;
    private void Awake()
    {
  		//因为最终打包为安卓给眼镜使用,所以普通的打印不够看,
    	//最好生成一个Text组件,交互按钮之后,将内容显示在里面
        showText = transform.Find("ShowText").GetComponent<Text>();
        //控制UI界面显隐
        group = transform.GetComponent<CanvasGroup>();
    }

    void Start()
    {

    }

    
    private void Update()
    {
    	//判断场景中有没有放入预制体,避免没放时报错
        if (WaveVR_ButtonManager.Instance == null)
            return;
		//大圆盘按下
        bool pressedTouchpad = WaveVR_Controller.Input(WaveVR_Controller.EDeviceType.Dominant).GetPressDown(WVR_InputId.WVR_InputId_Alias1_Touchpad);
        if (pressedTouchpad)
        {
            showText.text = "按下了Touchpad!!!";
            group.alpha = 1;
        }

		//扳手键按下
        bool pressedTrigger = WaveVR_Controller.Input(WaveVR_Controller.EDeviceType.Dominant).GetPressDown(WVR_InputId.WVR_InputId_Alias1_Trigger);
        if (pressedTrigger)
        {
            showText.text = "按下了Trigger!!!";
            group.alpha = 0;
        }
		//圆盘上按下
        bool pressedUp = WaveVR_Controller.Input(WaveVR_Controller.EDeviceType.Dominant).GetPressDown(WVR_InputId.WVR_InputId_Alias1_DPad_Up);
        if (pressedUp)
        {
            showText.text = "按下了Up!!!";
        }
		//中间大圆键按下,带横线那个
        bool pressedMenu = WaveVR_Controller.Input(WaveVR_Controller.EDeviceType.Dominant).GetPressDown(WVR_InputId.WVR_InputId_Alias1_Menu);
        if (pressedMenu)
        {
            showText.text = "按下了Menu!!!";
        }
		//音量键+按下
        bool pressedVolume_Up = WaveVR_Controller.Input(WaveVR_Controller.EDeviceType.Dominant).GetPressDown(WVR_InputId.WVR_InputId_Alias1_Volume_Up);
        if (pressedVolume_Up)
        {
            showText.text = "按下了Volume_Up!!!";
        }
    }
}