123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- using System.Collections;
- using System.Collections.Generic;
- using System;
- using UnityEngine;
- using UnityEngine.UI;
- using UnityEngine.EventSystems;
- using DG.Tweening;
- /// <summary>
- /// 虚拟摇杆
- /// </summary>
- public class Joystick : MonoBehaviour, IDragHandler, IPointerDownHandler, IPointerUpHandler
- {
- //事件
- public Action OnTouchDown;
- public Action<Vector2> 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;
- }
- /// <summary>
- /// 重设摇杆
- /// </summary>
- public void ResetJoystick()
- {
- if (OnTouchUp != null)
- {
- OnTouchUp();
- }
- //当结束拖动,要将物体归0,为了加一点缓冲效果
- childRectTrans.DOAnchorPos(Vector2.zero, 0.25f).OnUpdate(GetHV);
- }
- /// <summary>
- /// 按下
- /// </summary>
- /// <param name="eventData"> 事件数据 </param>
- 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();
- }
- }
- /// <summary>
- /// 抬起
- /// </summary>
- /// <param name="eventData"> 事件数据 </param>
- 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);
- }
- }
- }
|