【问题标题】:How to set an initial value for UI_Knob?如何设置 UI_Knob 的初始值?
【发布时间】:2017-04-07 12:05:15
【问题描述】:

我正在尝试为 UI.Extensions UI_Knob 设置初始值 请参阅指向 UI.Extensions 存储库的链接 UI.Extensions bitbutcket

通过一些搜索,我发现设置初始值的最佳方法可能是使用模拟的 pointerEventData 并使用 ExecuteEvents 将其传递给脚本,因为 UI_Knob 脚本使用鼠标位置来设置它的值。

--下面是 UI_Knob 的代码--

/// 信用 Tomasz Schelenz /// 来自-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> { }

}

【问题讨论】:

  • 很抱歉,我无法理解这个问题。你能澄清一下吗?

标签: c# user-interface unity3d


【解决方案1】:

我在没有使用模拟鼠标数据的情况下回答了我自己的问题。相反,我添加了一个带有 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;

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-30
    • 2019-08-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2020-09-22
    • 2013-12-19
    相关资源
    最近更新 更多