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