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 шт):
Таки получилось сделать через дельту угла поворота курсора (если этот набор слов имеет смысл): https://gist.github.com/immorom/e934ea4b5d3ae8f581fdf0be0a52ddf8
Еще буду дополнять функционал, но уже это мне нравится намного больше, чем реализация в UI Extensions.
