[Unity] Unity HTC VIVE 控制器代码

查看:594 |回复:2 | 2017-12-7 09:21:46

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 成林 于 2018-5-23 21:45 编辑

5.jpg
--------------------------------------------------------------------------------

using UnityEngine;  
using System.Collections;  
//检测手柄功能的脚本 这个脚本挂到手柄上(controlerright)和controlerleft))上  
public class ButtonTouchAction :MonoBehaviour {  
   //手柄  
   SteamVR_TrackedObject trackdeObjec;

   void Awake() {  
       //获取手柄上的这个组件  
       trackdeObjec = GetComponent<steamvr_trackedobject>();  
   }  
   // Use this for initialization  
   void Start () {     
   }  
   void FixedUpdate()  
   {   //获取手柄输入  
       var device = SteamVR_Controller.Input((int)trackdeObjec.index);  
       //以下是api中复制出来的按键列表  
       /*       public class ButtonMask
          {
               public const ulong System = (1ul<< (int)EVRButtonId.k_EButton_System); // reserved
               public const ulong ApplicationMenu= (1ul << (int)EVRButtonId.k_EButton_ApplicationMenu);
               public const ulong Grip = (1ul<< (int)EVRButtonId.k_EButton_Grip);
               public const ulong Axis0 = (1ul<< (int)EVRButtonId.k_EButton_Axis0);
               public const ulong Axis1 = (1ul<< (int)EVRButtonId.k_EButton_Axis1);
               public const ulong Axis2 = (1ul<< (int)EVRButtonId.k_EButton_Axis2);
               public const ulong Axis3 = (1ul<< (int)EVRButtonId.k_EButton_Axis3);
               public const ulong Axis4 = (1ul<< (int)EVRButtonId.k_EButton_Axis4);
               public const ulong Touchpad =(1ul << (int)EVRButtonId.k_EButton_SteamVR_Touchpad);
               public const ulong Trigger =(1ul << (int)EVRButtonId.k_EButton_SteamVR_Trigger);
          }
          */  

          //同样是三种按键方式,以后不做赘述  
       if (device.GetTouch(SteamVR_Controller.ButtonMask.Trigger)) {  
           Debug.Log("按了trigger“扳机键”");  

           //右手震动  
           //拉弓类似操作应该就是按住trigger(扳机)gettouch时持续调用震动方法模拟弓弦绷紧的感觉。  
           var deviceIndex2 =SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Rightmost);  
           SteamVR_Controller.Input(deviceIndex2).TriggerHapticPulse(500);  

       }  
       if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger))  
       {   Debug.Log("按下了 trigger “扳机键”");  

       }  
       if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger)) {  
           Debug.Log("松开了trigger“扳机键”");  

           //左手震动  
           var deviceIndex =SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Leftmost);  
           SteamVR_Controller.Input(deviceIndex).TriggerHapticPulse(3000);  

           //右手震动  
           var deviceIndex1 =SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Rightmost);  
           SteamVR_Controller.Input(deviceIndex1).TriggerHapticPulse(3000);  
       }  

       //这三种也能检测到后面不做赘述  
       if(device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger)) {  
           Debug.Log("press按下了trigger“扳机键”");  
       }  
       if (device.GetPress(SteamVR_Controller.ButtonMask.Trigger))  
       {  
            Debug.Log("press按了 trigger “扳机键”");  
       }  
       if (device.GetPressUp(SteamVR_Controller.ButtonMask.Trigger))  
       {  
           Debug.Log("press松开了trigger“扳机键”");  
       }  

       //system圆盘下面那个键   
       // reserved Steam系统保留,用来调出Steam系统菜单因此貌似自己加的功能没啥用  
       if (device.GetTouchDown(SteamVR_Controller.ButtonMask.System))  
       {  
           Debug.Log("按下了system“系统按钮/Steam");  
       }  
       if (device.GetPressDown(SteamVR_Controller.ButtonMask.System))  
       {  
           Debug.Log("press按下了System“系统按钮/Steam");  
       }  

       //ApplicationMenu带菜单标志的那个按键(在方向圆盘上面)  
       if(device.GetTouchDown(SteamVR_Controller.ButtonMask.ApplicationMenu))  
       {  
           Debug.Log("按下了 ApplicationMenu “菜单键”");  
       }  
       if(device.GetPressDown(SteamVR_Controller.ButtonMask.ApplicationMenu))  
       {  
           Debug.Log("press按下了ApplicationMenu“菜单键”");  
       }  

       //Grip两侧的键 vive雇佣兵游戏中的换弹键),每个手柄左右各一功能相同,同一手柄两个键是一个键。  
       if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Grip))  
       {  
           Debug.Log("按下了Grip ");  
       }  
       if (device.GetPressDown(SteamVR_Controller.ButtonMask.Grip))  
       {  
           Debug.Log("press按下了Grip ");  
       }  



       //Axis0与圆盘有交互 与圆盘有关  
       //触摸触发  
       if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis0))  
       {  
           Debug.Log("按下了Axis0“方向 ");  
       }  
       //按动触发  
       if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis0))  
       {  
           Debug.Log("press按下了Axis0“方向 ");  
       }  

       //Axis1  目前未发现按键位置  
       //触摸触发  
       if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis1))  
       {  
           Debug.Log("按下了Axis1 ");  
       }  
       //按动触发   
       if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis1))  
       {  
           Debug.Log("press按下了Axis1 ");  
       }  

       //Axis2目前未发现按键位置  
       //触摸触发  
       if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis2))  
       {  
           Debug.Log("按下了Axis2 ");  
       }  
        //按动触发  
       if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis2))  
       {  
           Debug.Log("press按下了Axis2 ");  
       }  

       //Axis3  未目前未发现按键位置  
       //触摸触发  
       if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis3))  
       {  
           Debug.Log("按下了Axis3 ");  
       }  
       //按动触发  
       if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis3))  
       {  
           Debug.Log("press按下了Axis3 ");  
       }  

       //Axis4  目前未发现按键位置  
       //触摸触发  
       if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis4))  
       {  
           Debug.Log("按下了Axis4 ");  
       }  
       //按动触发  
       if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis4))  
       {  
           Debug.Log("press按下了Axis4 ");  
       }  

//方向圆盘:  
       //这里开始区分了press检测与touch检测的不同之处,圆盘可以触摸,顾名思义,touch检测的是触摸,press检测的是按动<pre name="code" class="csharp"> //Axis0 与圆盘有交互 与圆盘有关  
       //触摸触发  
       if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis0))  
       {  
           Debug.Log("按下了Axis0“方向 ");  
       }  
       //按动触发  
       if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis0))  
       {  
           Debug.Log("press按下了Axis0“方向 ");  
       }  

       //Axis1  目前未发现按键位置  
       //触摸触发  
       if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis1))  
       {  
           Debug.Log("按下了Axis1 ");  
       }  
       //按动触发   
       if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis1))  
       {  
           Debug.Log("press按下了Axis1 ");  
       }  

       //Axis2目前未发现按键位置  
       //触摸触发  
       if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis2))  
       {  
           Debug.Log("按下了Axis2 ");  
       }  
       //按动触发  
       if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis2))  
       {  
           Debug.Log("press按下了Axis2 ");  
       }  

       //Axis3  未目前未发现按键位置  
       //触摸触发  
       if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis3))  
       {  
           Debug.Log("按下了Axis3 ");  
       }  
       //按动触发  
       if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis3))  
       {  
           Debug.Log("press按下了Axis3 ");  
       }  

       //Axis4  目前未发现按键位置  
       //触摸触发  
       if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis4))  
       {  
           Debug.Log("按下了Axis4 ");  
       }  
       //按动触发  
       if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis4))  
       {  
           Debug.Log("press按下了Axis4 ");  
       }  


       //ATouchpad 圆盘交互  
       //触摸触发  
       if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Touchpad))  
       {     
           Debug.Log("按下了Touchpad ");  

           //方法返回一个坐标接触圆盘位置  
           Vector2 cc = device.GetAxis();  
           Debug.Log(cc);  
           // 例子:圆盘分成上下左右  
           float jiaodu = VectorAngle(new Vector2(1, 0), cc);  
           Debug.Log(jiaodu);  
           //  
           if (jiaodu > 45 && jiaodu < 135)  
           {  
                Debug.Log("");  
           }  
           //  
           if (jiaodu < -45 && jiaodu > -135)  
           {  
                Debug.Log("");  
           }  
           //  
           if ((jiaodu < 180 && jiaodu > 135) || (jiaodu < -135&& jiaodu > -180))  
           {  
                Debug.Log("");  
           }  
           //  
           if ((jiaodu > 0 && jiaodu < 45) || (jiaodu > -45&& jiaodu < 0))  
           {  
                Debug.Log("");  
           }  
       }  
       //按动触发  
       if (device.GetPressDown(SteamVR_Controller.ButtonMask.Touchpad))  
       {  
           Debug.Log("press按下了Touchpad ");  
       }  





   }  
       // Update is called once per frame
       void Update () {  

   }  
   //方向圆盘最好配合这个使用圆盘的.GetAxis()会检测返回一个二位向量,可用角度划分圆盘按键数量  
   //这个函数输入两个二维向量会返回一个夹角 180 -180  
   float VectorAngle(Vector2 from, Vector2 to)  
   {  
       float angle;  
       Vector3 cross = Vector3.Cross(from, to);
       angle = Vector2.Angle(from, to);  
       return cross.z > 0 ? -angle : angle;
   }  
}
2017-12-7 09:21:46  
 赞 赞 0

使用道具 登录

2个回答,把该问题分享到群,邀请大神一起回答。
2#
感谢你的分享
回复 收起回复
2018-1-6 19:27:26   回复
 赞 赞 0

使用道具 登录

CG 游戏行业专业问题

Unity3D技术手机游戏引擎手游引擎
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表