OvertakingLegend/Assets/UIFrameWork/Script/Rocker.cs

152 lines
3.9 KiB
C#
Raw Permalink Normal View History

2025-03-24 03:08:22 +00:00
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;
/// <summary>
/// <20>ƶ<EFBFBD>ҡ<EFBFBD><D2A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public enum E_RockerType
{
/// <summary>
/// <20>̶<EFBFBD>
/// </summary>
Fixed,
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>
/// </summary>
FollowFixed,
/// <summary>
/// <20><><EFBFBD><EFBFBD>
/// </summary>
Follow,
}
/// <summary>
/// <20>ƶ<EFBFBD>ҡ<EFBFBD><D2A1>
/// </summary>
public class Rocker : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler, IEndDragHandler
{
/// <summary>
/// <20>߽<EFBFBD>
/// </summary>
public float maxBoundary;
/// <summary>
/// <20>Ƿ<EFBFBD><C7B7><EFBFBD>ʼ<EFBFBD><CABC>ק
/// </summary>
private bool isDrag;
/// <summary>
/// ҡ<>˵<EFBFBD>ͼ
/// </summary>
public Image rockerBM;
/// <summary>
/// <20>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public Image touchRect;
/// <summary>
/// ҡ<>˿<EFBFBD><CBBF><EFBFBD>
/// </summary>
public Image control;
/// <summary>
/// ҡ<><D2A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public E_RockerType e_RockerType;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public UnityAction<Vector2> dirListener;
/// <summary>
/// ̧<><CCA7><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>
/// </summary>
public UnityAction<bool> liftPressListener;
/// <summary>
/// <20>Ƕȼ<C7B6><C8BC><EFBFBD>
/// </summary>
public UnityAction<float> angleListener;
public void Start()
{
rockerBM.gameObject.SetActive(e_RockerType == E_RockerType.Fixed);
}
/// <summary>
/// <20>Ƿ<EFBFBD><C7B7><EFBFBD>ק
/// </summary>
/// <returns></returns>
public bool GetIsDrag()
{
return isDrag;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>ҡ<EFBFBD>˿<EFBFBD><CBBF>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>ģ<EFBFBD><C4A3>
/// </summary>
/// <returns></returns>
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);
}
}
}