2017-04-07 18 views
-1

は、私は初期値を設定する最良の方法は、シミュレートpointerEventDataとパスを使用することであるかもしれない発見したいくつかの検索を通じUI.ExtensionsレポUI.Extensions bitbutcketUI_Knobの初期値を設定する方法は?私はUI.Extensions UI_Knob の初期値を設定しようとしています

へのリンクを参照してくださいUI_Knobスクリプトはマウスの位置を使用して値を設定するため、ExecuteEventsを使用してスクリプトに渡します。私は自分の質問に答えたhttps://bitbucket.org/ddreaper/unity-ui-

//ONLY ALLOW ROTATION WITH POINTER OVER THE CONTROL 
    public void OnPointerDown(PointerEventData eventData) 
    { 
     _canDrag = true; 
    } 
    public void OnPointerUp(PointerEventData eventData) 
    { 
     _canDrag = false; 
    } 
    public void OnPointerEnter(PointerEventData eventData) 
    { 
     _canDrag = true; 
    } 
    public void OnPointerExit(PointerEventData eventData) 
    { 
     _canDrag = true;  // Now you can drag with pointer OFF control. 
    } 
    public void OnBeginDrag(PointerEventData eventData) 
    { 
     SetInitPointerData(eventData); 
    } 
    void SetInitPointerData(PointerEventData eventData) 
    { 
     _initRotation = transform.rotation; 
     _currentVector = eventData.position - (Vector2)transform.position; 
     _initAngle = Mathf.Atan2(_currentVector.y, _currentVector.x) * Mathf.Rad2Deg; 
    } 
    public void OnDrag(PointerEventData eventData) 
    { 
     //CHECK IF CAN DRAG 
     if (!_canDrag) 
     { 
      SetInitPointerData(eventData); 
      return; 
     } 
     _currentVector = eventData.position - (Vector2)transform.position; 
     _currentAngle = Mathf.Atan2(_currentVector.y, _currentVector.x) * Mathf.Rad2Deg; 

     Quaternion addRotation = Quaternion.AngleAxis(_currentAngle - _initAngle, this.transform.forward); 
     addRotation.eulerAngles = new Vector3(0, 0, addRotation.eulerAngles.z); 

     Quaternion finalRotation = _initRotation * addRotation; 

     if (direction == Direction.CW) 
     { 
      knobValue = 1 - (finalRotation.eulerAngles.z/360f); 

      if (snapToPosition) 
      { 
       SnapToPosition(ref knobValue); 
       finalRotation.eulerAngles = new Vector3(0, 0, 360 - 360 * knobValue); 
      } 
     } 
     else 
     { 
      knobValue = (finalRotation.eulerAngles.z/360f); 

      if (snapToPosition) 
      { 
       SnapToPosition(ref knobValue); 
       finalRotation.eulerAngles = new Vector3(0, 0, 360 * knobValue); 
      } 
     } 

     //PREVENT OVERROTATION 
     if (Mathf.Abs(knobValue - _previousValue) > 0.5f) 
     { 
      if (knobValue < 0.5f && loops > 1 && _currentLoops < loops - 1) 
      { 
       _currentLoops++; 
      } 
      else if (knobValue > 0.5f && _currentLoops >= 1) 
      { 
       _currentLoops--; 
      } 
      else 
      { 
       if (knobValue > 0.5f && _currentLoops == 0) 
       { 
        knobValue = 0; 
        transform.localEulerAngles = Vector3.zero; 
        SetInitPointerData(eventData); 
        InvokeEvents(knobValue + _currentLoops); 
        return; 
       } 
       else if (knobValue < 0.5f && _currentLoops == loops - 1) 
       { 
        knobValue = 1; 
        transform.localEulerAngles = Vector3.zero; 
        SetInitPointerData(eventData); 
        InvokeEvents(knobValue + _currentLoops); 
        return; 
       } 
      } 
     } 

     //CHECK MAX VALUE 
     if (maxValue > 0) 
     { 
      if (knobValue + _currentLoops > maxValue) 
      { 
       knobValue = maxValue; 
       float maxAngle = direction == Direction.CW ? 360f - 360f * maxValue : 360f * maxValue; 
       transform.localEulerAngles = new Vector3(0, 0, maxAngle); 
       SetInitPointerData(eventData); 
       InvokeEvents(knobValue); 
       return; 
      } 
     } 

     transform.rotation = finalRotation; 
     InvokeEvents(knobValue + _currentLoops); 

     _previousValue = knobValue; 
    } 
    private void SnapToPosition(ref float knobValue) 
    { 
     float snapStep = 1/(float)snapStepsPerLoop; 
     float newValue = Mathf.Round(knobValue/snapStep) * snapStep; 
     knobValue = newValue; 
    } 
    private void InvokeEvents(float value) 
    { 
     if (clampOutput01) 
      value /= loops; 
     OnValueChanged.Invoke(value); 
    } 



} 

[System.Serializable] 
public class KnobFloatValueEvent : UnityEvent<float> { } 

}

+0

申し訳ありませんが、私は質問を理解できません。明確にできますか? – Hristo

答えて

0

-

--BELOWが発信元とUI_Knob--

///クレジットトマシュSchelenz ///のコードですシミュレートされたマウスデータを使用することなく。代わりに、MyStartingAngle()メソッドを使用してStart()メソッドを追加しました。下記参照。私はUI_Knobの回転/設定値の方法を切り刻み、基本的には自分の角度を注入しました。私はまだ誰かが喜んでいる場合、シミュレートされたマウスデータでこれを実行する方法を知りたいです。私は私の解決策についての意見もありがとうと思います。読んでくれてありがとう!!

// ADD THIS INTO UI_Knob script below initialization. 
// I added this here to allow for setting an initial rotation/value. 

    void Start(){ 
     float myFirstAngle = 180f; 
     MyStartingAngle (myFirstAngle); 
    } 

    void MyStartingAngle(float angle){ 

     _initRotation = transform.rotation; 

     Quaternion addRotation = Quaternion.AngleAxis(angle, this.transform.forward); 
     addRotation.eulerAngles = new Vector3(0, 0, addRotation.eulerAngles.z); 

     Quaternion finalRotation = _initRotation * addRotation; 


     knobValue = 1 - (finalRotation.eulerAngles.z/360f); 

     transform.rotation = finalRotation; 
     InvokeEvents(knobValue + _currentLoops); 

     _previousValue = knobValue; 

    } 
関連する問題