ProjectDDD/Assets/_Datas/SLShared/SLUnity/Editor/SLUI/SLScreenStick.cs
2025-06-17 20:47:57 +09:00

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;
}
}
}