Joystick.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System;
  4. using UnityEngine;
  5. using UnityEngine.UI;
  6. using UnityEngine.EventSystems;
  7. using DG.Tweening;
  8. /// <summary>
  9. /// 虚拟摇杆
  10. /// </summary>
  11. public class Joystick : MonoBehaviour, IDragHandler, IPointerDownHandler, IPointerUpHandler
  12. {
  13. //事件
  14. public Action OnTouchDown;
  15. public Action<Vector2> OnTouchMove;
  16. public Action OnTouchUp;
  17. public static float h, v; //传出hv
  18. public float maxDis; //最大距离
  19. private Vector2 v2Data = Vector2.zero;
  20. private RectTransform rectTransform;
  21. private RectTransform childRectTrans;
  22. void Start()
  23. {
  24. rectTransform = transform as RectTransform;
  25. childRectTrans = transform.GetChild(0) as RectTransform;
  26. }
  27. /// <summary>
  28. /// 重设摇杆
  29. /// </summary>
  30. public void ResetJoystick()
  31. {
  32. if (OnTouchUp != null)
  33. {
  34. OnTouchUp();
  35. }
  36. //当结束拖动,要将物体归0,为了加一点缓冲效果
  37. childRectTrans.DOAnchorPos(Vector2.zero, 0.25f).OnUpdate(GetHV);
  38. }
  39. /// <summary>
  40. /// 按下
  41. /// </summary>
  42. /// <param name="eventData"> 事件数据 </param>
  43. public void OnPointerDown(PointerEventData eventData)
  44. {
  45. if (OnTouchDown != null)
  46. {
  47. OnTouchDown();
  48. }
  49. Vector3 outPos;
  50. if (RectTransformUtility.ScreenPointToWorldPointInRectangle(this.transform as RectTransform, eventData.position, eventData.pressEventCamera, out outPos))
  51. {
  52. childRectTrans.position = outPos;
  53. //限制拖拽距离
  54. childRectTrans.anchoredPosition = Vector2.ClampMagnitude(childRectTrans.anchoredPosition, maxDis);
  55. GetHV();
  56. }
  57. }
  58. /// <summary>
  59. /// 抬起
  60. /// </summary>
  61. /// <param name="eventData"> 事件数据 </param>
  62. public void OnPointerUp(PointerEventData eventData)
  63. {
  64. if (OnTouchUp != null)
  65. {
  66. OnTouchUp();
  67. }
  68. //当结束拖动,要将物体归0,为了加一点缓冲效果
  69. childRectTrans.DOAnchorPos(Vector2.zero, 0.25f).OnUpdate(GetHV);
  70. }
  71. public void OnDrag(PointerEventData eventData)
  72. {
  73. Vector3 outPos;
  74. if (RectTransformUtility.ScreenPointToWorldPointInRectangle(this.transform as RectTransform, eventData.position, eventData.pressEventCamera, out outPos))
  75. {
  76. childRectTrans.position = outPos;
  77. //限制拖拽距离
  78. childRectTrans.anchoredPosition = Vector2.ClampMagnitude(childRectTrans.anchoredPosition, maxDis);
  79. GetHV();
  80. }
  81. }
  82. private void GetHV()
  83. {
  84. h = childRectTrans.anchoredPosition.x / maxDis;
  85. v = childRectTrans.anchoredPosition.y / maxDis;
  86. v2Data.Set(h, v);
  87. if (OnTouchMove != null)
  88. {
  89. OnTouchMove(v2Data);
  90. }
  91. }
  92. }