2016-11-19 19 views
1

このラジアルメニューは、左手のワンドのトラックパッドで制御されています。トラックパッド上で指の位置によってどのボタンを拡大するかを決定します。Unity3d HTC Viveラジアルメニュー - 奇妙なグリッチ

奇妙な動きは、hereで見ることができます。

ここで私はこの問題に関連するコードを攻撃しました。左のワンドのコードです。

SteamVR_TrackedObject obj; //The wand 
public GameObject buttonHolder; //All the buttons will be children of this object 
public bool buttonEnabled; 

void Awake() { 
    obj = GetComponent<SteamVR_TrackedObject>(); //this will be left hand controller 
} 


void Update() { 
    var device = SteamVR_Controller.Input((int)obj.index); 

    //if touchpad touched 
    if (device.GetTouch(SteamVR_Controller.ButtonMask.Touchpad)) 
    { 
     if (buttonEnabled) //if radial menu is open 
     { 
      //touchPadAngle: Get the angle between touch coord and X-axis 
      Vector2 touchedCoord = device.GetAxis(EVRButtonId.k_EButton_Axis0); //what is this line each variable 
      float touchPadAngle = VectorAngle(new Vector2(1, 0), touchedCoord); //(1, 0) is X-axis 


      // ------------------- Find closest button ------------------------ 
      //Description: The process will be done by calculating the angle between button_Vector2 and X-axis (button_V2_to_10) 
      //   And then find the button with the closest angler difference with (touchPadAngle). 
      float minAngle = float.PositiveInfinity; 
      Transform minButton = transform; //Temperatry assign wand tranform to it. 
      float pad_N_button_Angle = 0.0f; //Angle between touchPadAngle and buttonAngle. 

      Vector2 button_V2_to_10; 
      float button_Angle; 
      foreach (Transform bt in buttonHolder.transform) 
      { 
       button_V2_to_10 = new Vector2(transform.position.x, transform.position.z) - new Vector2(bt.position.x, bt.position.z); 
       button_Angle = VectorAngle(new Vector2(1, 0), button_V2_to_10); 

       pad_N_button_Angle = Mathf.Abs(button_Angle - touchPadAngle); 
       //Both buttonAngle and touchPadAngle range from -180 to 180, avoid Abs(170 - (-170)) = 340 
       pad_N_button_Angle = (pad_N_button_Angle > 180) ? Mathf.Abs(pad_N_button_Angle - 360) : pad_N_button_Angle; 

       if (pad_N_button_Angle < minAngle) 
       { 
        minButton = bt; 
        minAngle = pad_N_button_Angle; 
       } 
      } 

      //Magnify the closest button 
      foreach (Transform bt in buttonHolder.transform) 
      { 
       GameObject btGO = bt.gameObject; 
       if (!btGO.GetComponentInChildren<ButtomHandler>().onHover && bt == minButton) { 
        //Magnify 
       } 
       else if (bt != minButton && btGO.GetComponentInChildren<ButtomHandler>().onHover) 
       { 
        //minify 
       } 
      } 
     } 
     else { 
      activateButtonMenu(); 
     } 
    } 


    //dis-hover all button if leave touch pad 
    if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Touchpad)) { 
     //Hover the closest button 
     foreach (Transform bt in buttonHolder.transform) 
     { 
      GameObject btGO = bt.gameObject; 
      if (btGO.GetComponentInChildren<ButtomHandler>().onHover) 
      { 
       //minify 
      } 
     } 
    } 

私はここに非常にstuckedよ、すべてのヘルプは本当に

はあなたが放射状に複数の軸を考慮するべきではありません

答えて

1

「(touchPadAngle)と最も釣り人の違い」をいただければ幸いですダイヤル?

+0

申し訳ありませんが、私はそれを得ていませんでした、私が逃した軸が増えていますか? – libra

+0

もしあなたがそれについて考えるなら、それは違いの値が小さすぎると2つの州の間で切り替わるだろう - ビデオは2人が水平であるときに起こるように見える - オフラインで私に連絡すること自由に感じる - メニューコード/アセットも表示されます。 – dljava

関連する問題