using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using DG.Tweening;
///
/// 虚拟摇杆
///
public class Joystick : MonoBehaviour, IDragHandler, IPointerDownHandler, IPointerUpHandler
{
//事件
public Action OnTouchDown;
public Action OnTouchMove;
public Action OnTouchUp;
public static float h, v; //传出hv
public float maxDis; //最大距离
private Vector2 v2Data = Vector2.zero;
private RectTransform rectTransform;
private RectTransform childRectTrans;
void Start()
{
rectTransform = transform as RectTransform;
childRectTrans = transform.GetChild(0) as RectTransform;
}
///
/// 重设摇杆
///
public void ResetJoystick()
{
if (OnTouchUp != null)
{
OnTouchUp();
}
//当结束拖动,要将物体归0,为了加一点缓冲效果
childRectTrans.DOAnchorPos(Vector2.zero, 0.25f).OnUpdate(GetHV);
}
///
/// 按下
///
/// 事件数据
public void OnPointerDown(PointerEventData eventData)
{
if (OnTouchDown != null)
{
OnTouchDown();
}
Vector3 outPos;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(this.transform as RectTransform, eventData.position, eventData.pressEventCamera, out outPos))
{
childRectTrans.position = outPos;
//限制拖拽距离
childRectTrans.anchoredPosition = Vector2.ClampMagnitude(childRectTrans.anchoredPosition, maxDis);
GetHV();
}
}
///
/// 抬起
///
/// 事件数据
public void OnPointerUp(PointerEventData eventData)
{
if (OnTouchUp != null)
{
OnTouchUp();
}
//当结束拖动,要将物体归0,为了加一点缓冲效果
childRectTrans.DOAnchorPos(Vector2.zero, 0.25f).OnUpdate(GetHV);
}
public void OnDrag(PointerEventData eventData)
{
Vector3 outPos;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(this.transform as RectTransform, eventData.position, eventData.pressEventCamera, out outPos))
{
childRectTrans.position = outPos;
//限制拖拽距离
childRectTrans.anchoredPosition = Vector2.ClampMagnitude(childRectTrans.anchoredPosition, maxDis);
GetHV();
}
}
private void GetHV()
{
h = childRectTrans.anchoredPosition.x / maxDis;
v = childRectTrans.anchoredPosition.y / maxDis;
v2Data.Set(h, v);
if (OnTouchMove != null)
{
OnTouchMove(v2Data);
}
}
}