using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;
///
/// 移动摇杆类型
///
public enum E_RockerType
{
///
/// 固定
///
Fixed,
///
/// 跟随固定
///
FollowFixed,
///
/// 跟随
///
Follow,
}
///
/// 移动摇杆
///
public class Rocker : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler, IEndDragHandler
{
///
/// 边界
///
public float maxBoundary;
///
/// 是否开始拖拽
///
private bool isDrag;
///
/// 摇杆底图
///
public Image rockerBM;
///
/// 事件触发区域
///
public Image touchRect;
///
/// 摇杆控制
///
public Image control;
///
/// 摇杆类型
///
public E_RockerType e_RockerType;
///
/// 方向监听
///
public UnityAction dirListener;
///
/// 抬起按下监听
///
public UnityAction liftPressListener;
///
/// 角度监听
///
public UnityAction angleListener;
public void Start()
{
rockerBM.gameObject.SetActive(e_RockerType == E_RockerType.Fixed);
}
///
/// 是否拖拽
///
///
public bool GetIsDrag()
{
return isDrag;
}
///
/// 返回摇杆控制到中心点的模长
///
///
public Vector3 GetMagnitude()
{
return control.transform.position - rockerBM.transform.position;
}
public virtual void OnDrag(PointerEventData eventData)
{
isDrag = true;
Vector2 localPos;
Vector3 vector= this.transform.position + Vector3.one * maxBoundary - control.transform.position;
RectTransformUtility.ScreenPointToLocalPointInRectangle(rockerBM.rectTransform, (eventData as PointerEventData).position, (eventData as PointerEventData).pressEventCamera, out localPos);
if (localPos.magnitude > maxBoundary)
{
if (e_RockerType == E_RockerType.Follow)
{
rockerBM.transform.localPosition += (Vector3)localPos.normalized * (localPos.magnitude - maxBoundary);
}
control.transform.localPosition = localPos.normalized * maxBoundary;
}
else
{
control.transform.localPosition = localPos;
}
dirListener?.Invoke(localPos.normalized);
float angel = Mathf.Atan2(localPos.x, localPos.y);
angleListener?.Invoke(angel * Mathf.Rad2Deg);
}
public void OnEndDrag(PointerEventData eventData)
{
isDrag = false;
control.rectTransform.anchoredPosition = Vector2.zero;
dirListener?.Invoke(Vector2.zero);
}
public void OnPointerDown(PointerEventData eventData)
{
Vector2 localPos;
liftPressListener?.Invoke(true);
rockerBM.gameObject.SetActive(true);
if (e_RockerType != E_RockerType.Fixed)
{
RectTransformUtility.ScreenPointToLocalPointInRectangle(touchRect.rectTransform, (eventData as PointerEventData).position, (eventData as PointerEventData).pressEventCamera, out localPos);
rockerBM.transform.localPosition = localPos;
}
}
public void OnPointerUp(PointerEventData eventData)
{
liftPressListener?.Invoke(false);
if (e_RockerType != E_RockerType.Fixed)
{
rockerBM.gameObject.SetActive(false);
}
}
}