UI потенциометр в Unity

Захотел элемент управления, которого нет в стандартном UI-наборе Unity. До сих пор не знаю, как правильно это обозвать: потенциометр, ручка, крутилка.

Нашел пакет Unity UI Extensions (https://github.com/Unity-UI-Extensions/com.unity.uiextensions), но их "Knob" то и дело выдает что-то абсолютно неприемлемое. Ну и за неимением лучшего решил попробовать написать сам.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using UnityEngine.EventSystems;

public class knob : MonoBehaviour, IDragHandler, IPointerDownHandler
{
    float Angle;
    float Value;

    float startAngle;
    Vector2 startVector;

    public void OnPointerDown(PointerEventData eventData)
    {
        startAngle = Angle;
        startVector = Input.mousePosition - transform.position;
    }

    float _prevMouseAngleDelta;

    public void OnDrag(PointerEventData eventData)
    {
        float mouseAngleDelta = Vector2.SignedAngle(Input.mousePosition - transform.position, startVector);

        Angle = startAngle + mouseAngleDelta;

        transform.rotation = Quaternion.AngleAxis(Angle, Vector3.back);

        Value = Mathf.Lerp(minVal, maxVal, Angle / 360f);

        _prevMouseAngleDelta = mouseAngleDelta;
    }
}

Получилось сделать так, чтобы сохранялся один большой угол, на который повернули ручку. Его (угол) получается накручивать (и раскручивать в минус), если мусолить курсором на одном месте. После первого же круга (или полукруга, в случае с Vector2.SignedAngle) mouseAngleDelta снова становится нулевым, и угол поворота ручки циклично дрыгается на месте ("А:" на гифке).

Крутите барабан

Все упирается в подсчет полных оборотов. Из альтернатив, чтобы с этим не маяться, думал добавлять вращение ручке постоянно, типа moveTowards.


Ответы (1 шт):

Автор решения: immorom

Таки получилось сделать через дельту угла поворота курсора (если этот набор слов имеет смысл): https://gist.github.com/immorom/e934ea4b5d3ae8f581fdf0be0a52ddf8

Еще буду дополнять функционал, но уже это мне нравится намного больше, чем реализация в UI Extensions.

→ Ссылка