79 lines
2.6 KiB (Stored with Git LFS)
C#
79 lines
2.6 KiB (Stored with Git LFS)
C#
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<RectTransform>(), 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<RectTransform>(), 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;
|
|
}
|
|
}
|
|
} |