Skip to main content
ARShow
ARShow
 首页 » 资源教程

unity htcvive sdk 按键

2016年08月19日 18:30:4716050
  1. using UnityEngine;    

  2. using System.Collections;    

  3. //检测手柄功能的脚本 这个脚本挂到手柄上(controler(right)和controler(left))上    

  4. public class ButtonTouchAction : MonoBehaviour {    

  5.     //手柄    

  6.     SteamVR_TrackedObject trackdeObjec;    

  7.     

  8.     void Awake() {    

  9.         //获取手柄上的这个组件    

  10.         trackdeObjec = GetComponent<SteamVR_TrackedObject>();    

  11.     }    

  12.     // Use this for initialization    

  13.     void Start () {       

  14.     }    

  15.     void FixedUpdate()    

  16.     {   //获取手柄输入    

  17.         var device = SteamVR_Controller.Input((int)trackdeObjec.index);    

  18.         //以下是api中复制出来的按键列表    

  19.         /*       public class ButtonMask  

  20.            {  

  21.                public const ulong System = (1ul << (int)EVRButtonId.k_EButton_System); // reserved  

  22.                public const ulong ApplicationMenu = (1ul << (int)EVRButtonId.k_EButton_ApplicationMenu);  

  23.                public const ulong Grip = (1ul << (int)EVRButtonId.k_EButton_Grip);  

  24.                public const ulong Axis0 = (1ul << (int)EVRButtonId.k_EButton_Axis0);  

  25.                public const ulong Axis1 = (1ul << (int)EVRButtonId.k_EButton_Axis1);  

  26.                public const ulong Axis2 = (1ul << (int)EVRButtonId.k_EButton_Axis2);  

  27.                public const ulong Axis3 = (1ul << (int)EVRButtonId.k_EButton_Axis3);  

  28.                public const ulong Axis4 = (1ul << (int)EVRButtonId.k_EButton_Axis4);  

  29.                public const ulong Touchpad = (1ul << (int)EVRButtonId.k_EButton_SteamVR_Touchpad);  

  30.                public const ulong Trigger = (1ul << (int)EVRButtonId.k_EButton_SteamVR_Trigger);  

  31.            }  

  32.            */    

  33.     

  34.            //同样是三种按键方式,以后不做赘述    

  35.         if (device.GetTouch(SteamVR_Controller.ButtonMask.Trigger)) {    

  36.             Debug.Log("按了 “trigger” “扳机键”");    

  37.                

  38.             //右手震动    

  39.             //拉弓类似操作应该就是按住trigger(扳机)gettouch时持续调用震动方法模拟弓弦绷紧的感觉。    

  40.             var deviceIndex2 = SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Rightmost);    

  41.             SteamVR_Controller.Input(deviceIndex2).TriggerHapticPulse(500);    

  42.     

  43.         }    

  44.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger))    

  45.         {   Debug.Log("按下了 “trigger” “扳机键”");    

  46.     

  47.         }    

  48.         if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger)) {    

  49.             Debug.Log("松开了 “trigger” “扳机键”");    

  50.               

  51.             //左手震动    

  52.             var deviceIndex = SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Leftmost);    

  53.             SteamVR_Controller.Input(deviceIndex).TriggerHapticPulse(3000);    

  54.                

  55.             //右手震动    

  56.             var deviceIndex1 = SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Rightmost);    

  57.             SteamVR_Controller.Input(deviceIndex1).TriggerHapticPulse(3000);    

  58.         }    

  59.     

  60.         //这三种也能检测到 后面不做赘述    

  61.         if(device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger)) {    

  62.             Debug.Log("用press按下了 “trigger” “扳机键”");    

  63.         }    

  64.         if (device.GetPress(SteamVR_Controller.ButtonMask.Trigger))    

  65.         {    

  66.             Debug.Log("用press按了 “trigger” “扳机键”");    

  67.         }    

  68.         if (device.GetPressUp(SteamVR_Controller.ButtonMask.Trigger))    

  69.         {    

  70.             Debug.Log("用press松开了 “trigger” “扳机键”");    

  71.         }    

  72.     

  73.         //system键 圆盘下面那个键     

  74.         // reserved 为Steam系统保留,用来调出Steam系统菜单 因此貌似自己加的功能没啥用    

  75.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.System))    

  76.         {    

  77.             Debug.Log("按下了 “system” “系统按钮/Steam”");    

  78.         }    

  79.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.System))    

  80.         {    

  81.             Debug.Log("用press按下了 “System” “系统按钮/Steam”");    

  82.         }    

  83.     

  84.         //ApplicationMenu键 带菜单标志的那个按键(在方向圆盘上面)    

  85.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.ApplicationMenu))    

  86.         {    

  87.             Debug.Log("按下了 “ApplicationMenu” “菜单键”");    

  88.         }    

  89.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.ApplicationMenu))    

  90.         {    

  91.             Debug.Log("用press按下了 “ApplicationMenu” “菜单键”");    

  92.         }    

  93.     

  94.         //Grip键 两侧的键 (vive雇佣兵游戏中的换弹键),每个手柄左右各一功能相同,同一手柄两个键是一个键。    

  95.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Grip))    

  96.         {    

  97.             Debug.Log("按下了 “Grip” “ ”");    

  98.         }    

  99.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Grip))    

  100.         {    

  101.             Debug.Log("用press按下了 “Grip” “ ”");    

  102.         }    

  103.     

  104.      

  105.             

  106.         //Axis0键 与圆盘有交互 与圆盘有关    

  107.         //触摸触发    

  108.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis0))    

  109.         {    

  110.             Debug.Log("按下了 “Axis0” “方向 ”");    

  111.         }    

  112.         //按动触发    

  113.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis0))    

  114.         {    

  115.             Debug.Log("用press按下了 “Axis0” “方向 ”");    

  116.         }    

  117.     

  118.         //Axis1键  目前未发现按键位置    

  119.         //触摸触发    

  120.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis1))    

  121.         {    

  122.             Debug.Log("按下了 “Axis1” “ ”");    

  123.         }    

  124.         //按动触发     

  125.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis1))    

  126.         {    

  127.             Debug.Log("用press按下了 “Axis1” “ ”");    

  128.         }    

  129.     

  130.         //Axis2键 目前未发现按键位置    

  131.         //触摸触发    

  132.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis2))    

  133.         {    

  134.             Debug.Log("按下了 “Axis2” “ ”");    

  135.         }    

  136.         //按动触发    

  137.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis2))    

  138.         {    

  139.             Debug.Log("用press按下了 “Axis2” “ ”");    

  140.         }    

  141.     

  142.         //Axis3键  未目前未发现按键位置    

  143.         //触摸触发    

  144.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis3))    

  145.         {    

  146.             Debug.Log("按下了 “Axis3” “ ”");    

  147.         }    

  148.         //按动触发    

  149.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis3))    

  150.         {    

  151.             Debug.Log("用press按下了 “Axis3” “ ”");    

  152.         }    

  153.     

  154.         //Axis4键  目前未发现按键位置    

  155.         //触摸触发    

  156.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis4))    

  157.         {    

  158.             Debug.Log("按下了 “Axis4” “ ”");    

  159.         }    

  160.         //按动触发    

  161.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis4))    

  162.         {    

  163.             Debug.Log("用press按下了 “Axis4” “ ”");    

  164.         }    

  165.     

  166. <pre name="code" class="csharp">       //方向圆盘:    

  167.         //这里开始区分了press检测与touch检测的不同之处,圆盘可以触摸,顾名思义,touch检测的是触摸,press检测的是按动<pre name="code" class="csharp"> //Axis0键 与圆盘有交互 与圆盘有关    

  168.         //触摸触发    

  169.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis0))    

  170.         {    

  171.             Debug.Log("按下了 “Axis0” “方向 ”");    

  172.         }    

  173.         //按动触发    

  174.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis0))    

  175.         {    

  176.             Debug.Log("用press按下了 “Axis0” “方向 ”");    

  177.         }    

  178.     

  179.         //Axis1键  目前未发现按键位置    

  180.         //触摸触发    

  181.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis1))    

  182.         {    

  183.             Debug.Log("按下了 “Axis1” “ ”");    

  184.         }    

  185.         //按动触发     

  186.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis1))    

  187.         {    

  188.             Debug.Log("用press按下了 “Axis1” “ ”");    

  189.         }    

  190.     

  191.         //Axis2键 目前未发现按键位置    

  192.         //触摸触发    

  193.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis2))    

  194.         {    

  195.             Debug.Log("按下了 “Axis2” “ ”");    

  196.         }    

  197.         //按动触发    

  198.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis2))    

  199.         {    

  200.             Debug.Log("用press按下了 “Axis2” “ ”");    

  201.         }    

  202.     

  203.         //Axis3键  未目前未发现按键位置    

  204.         //触摸触发    

  205.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis3))    

  206.         {    

  207.             Debug.Log("按下了 “Axis3” “ ”");    

  208.         }    

  209.         //按动触发    

  210.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis3))    

  211.         {    

  212.             Debug.Log("用press按下了 “Axis3” “ ”");    

  213.         }    

  214.     

  215.         //Axis4键  目前未发现按键位置    

  216.         //触摸触发    

  217.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis4))    

  218.         {    

  219.             Debug.Log("按下了 “Axis4” “ ”");    

  220.         }    

  221.         //按动触发    

  222.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis4))    

  223.         {    

  224.             Debug.Log("用press按下了 “Axis4” “ ”");    

  225.         }    

  226.     

  227.     

  228.         //ATouchpad键 圆盘交互    

  229.         //触摸触发    

  230.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Touchpad))    

  231.         {       

  232.             Debug.Log("按下了 “Touchpad” “ ”");    

  233.                 

  234.             //方法返回一个坐标 接触圆盘位置    

  235.             Vector2 cc = device.GetAxis();    

  236.             Debug.Log(cc);    

  237.             // 例子:圆盘分成上下左右    

  238.             float jiaodu = VectorAngle(new Vector2(1, 0), cc);    

  239.             Debug.Log(jiaodu);    

  240.             //下    

  241.             if (jiaodu > 45 && jiaodu < 135)    

  242.             {    

  243.                 Debug.Log("下");    

  244.             }    

  245.             //上    

  246.             if (jiaodu < -45 && jiaodu > -135)    

  247.             {    

  248.                 Debug.Log("上");    

  249.             }    

  250.             //左    

  251.             if ((jiaodu < 180 && jiaodu > 135) || (jiaodu < -135 && jiaodu > -180))    

  252.             {    

  253.                 Debug.Log("左");    

  254.             }    

  255.             //右    

  256.             if ((jiaodu > 0 && jiaodu < 45) || (jiaodu > -45 && jiaodu < 0))    

  257.             {    

  258.                 Debug.Log("右");    

  259.             }    

  260.         }    

  261.         //按动触发    

  262.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Touchpad))    

  263.         {    

  264.             Debug.Log("用press按下了 “Touchpad” “ ”");    

  265.         }    

  266.     

  267.            

  268.     

  269.     

  270.     

  271.     }    

  272.         // Update is called once per frame    

  273.         void Update () {    

  274.         

  275.     }    

  276.     //方向圆盘最好配合这个使用 圆盘的.GetAxis()会检测返回一个二位向量,可用角度划分圆盘按键数量    

  277.     //这个函数输入两个二维向量会返回一个夹角 180 到 -180    

  278.     float VectorAngle(Vector2 from, Vector2 to)    

  279.     {    

  280.         float angle;    

  281.         Vector3 cross = Vector3.Cross(from, to);    

  282.         angle = Vector2.Angle(from, to);    

  283.         return cross.z > 0 ? -angle : angle;    

  284.     }    

  285. }    


评论列表暂无评论
发表评论