using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.InputSystem.OnScreen; using UnityEngine.Serialization; namespace Superlazy.UI { public class SLScreenStick : OnScreenControl, IPointerDownHandler, IPointerUpHandler, IDragHandler { public void OnPointerDown(PointerEventData eventData) { if (eventData == null) throw new System.ArgumentNullException(nameof(eventData)); RectTransformUtility.ScreenPointToLocalPointInRectangle(transform.parent.GetComponentInParent(), eventData.position, eventData.pressEventCamera, out pointerDownPos); padImagePos = rangeImage.position; rangeImage.position = eventData.position; } public void OnDrag(PointerEventData eventData) { if (eventData == null) throw new System.ArgumentNullException(nameof(eventData)); RectTransformUtility.ScreenPointToLocalPointInRectangle(transform.parent.GetComponentInParent(), eventData.position, eventData.pressEventCamera, out var position); var delta = position - pointerDownPos; delta = Vector2.ClampMagnitude(delta, MovementRange); padImage.anchoredPosition = startPos + (Vector3)delta; var newPos = new Vector2(delta.x / MovementRange, delta.y / MovementRange); SendValueToControl(newPos); } public void OnPointerUp(PointerEventData eventData) { SendValueToControl(Vector2.zero); padImage.anchoredPosition = startPos; rangeImage.position = padImagePos; } private void Start() { startPos = padImage.anchoredPosition; } public float MovementRange { get => movementRange; set => movementRange = value; } [FormerlySerializedAs("movementRange")] [SerializeField] private float movementRange = 50; [FormerlySerializedAs("PadImage")] [SerializeField] private readonly RectTransform padImage; [FormerlySerializedAs("RangeImage")] [SerializeField] private readonly Transform rangeImage; [FormerlySerializedAs("ControlPath")] [SerializeField] private new string controlPath; private Vector3 startPos; private Vector3 padImagePos; private Vector2 pointerDownPos; protected override string controlPathInternal { get => controlPath; set => controlPath = value; } } }