FBTouchPad.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using System;
  2. using FBInput;
  3. using UnityEngine;
  4. public class FBTouchPad : AbstractTouchElement
  5. {
  6. public Vector2 Axis { get; private set; }
  7. private bool _dynamicJoystickOpen
  8. {
  9. get
  10. {
  11. return R.Settings.DynamicJoystickOpen;
  12. }
  13. }
  14. private void Awake()
  15. {
  16. this.UpdateRadiusAndPosition();
  17. this._lastAnchor = new Vector2(100000f, 100000f);
  18. this.SetDefaultState();
  19. }
  20. protected override void OnTouchDown(Vector2 touchPosition)
  21. {
  22. if ((touchPosition - this._lastAnchor).sqrMagnitude > 4f * this._radiusSqr && this._dynamicJoystickOpen)
  23. {
  24. base.transform.localPosition = touchPosition;
  25. this._anchor = touchPosition;
  26. }
  27. this.BackgroundSprite.color = Color.white;
  28. }
  29. protected override void OnTouchUp(Vector2 localPosition)
  30. {
  31. this._lastAnchor = this._anchor;
  32. this.SetDefaultState();
  33. }
  34. protected override void OnTouch(Vector2 localPosition)
  35. {
  36. Vector2 vector = localPosition - this._anchor;
  37. if (vector.sqrMagnitude < this._radiusSqr)
  38. {
  39. vector /= this._radius;
  40. }
  41. else
  42. {
  43. vector = vector.normalized;
  44. }
  45. if (vector.sqrMagnitude >= FBTouchPad.DeadZoneRadiusSqr)
  46. {
  47. this.Axis = ((!base.IsActive) ? Vector2.zero : vector);
  48. float num = 57.29578f * Mathf.Atan2(this.Axis.y, this.Axis.x);
  49. num = (float)Mathf.RoundToInt(num / 45f) * 45f;
  50. this.HintHandle.rotation = Quaternion.Euler(num * Vector3.forward);
  51. this.HintSprite.color = Color.white;
  52. }
  53. else
  54. {
  55. this.HintSprite.color = new Color(1f, 1f, 1f, 0f);
  56. }
  57. }
  58. private void SetDefaultState()
  59. {
  60. this.Axis = Vector2.zero;
  61. this.BackgroundSprite.color = new Color(1f, 1f, 1f, 0.5f);
  62. this.HintSprite.color = new Color(1f, 1f, 1f, 0f);
  63. }
  64. protected override bool TestTouchArea(Vector2 screenPosition)
  65. {
  66. return (this._dynamicJoystickOpen || (screenPosition - this._anchor).sqrMagnitude <= 4f * this._radiusSqr) && screenPosition.x < (float)UITools.ScreenWidth / 2f;
  67. }
  68. public void UpdateRadiusAndPosition()
  69. {
  70. this._radius = ((!this._dynamicJoystickOpen) ? (this.Radius * 1.5f) : this.Radius);
  71. this._radiusSqr = this._radius * this._radius;
  72. base.transform.localPosition = this._defaultPosition;
  73. this._anchor = base.transform.localPosition;
  74. }
  75. public static readonly float DeadZoneRadius = 0.1f;
  76. private static readonly float DeadZoneRadiusSqr = FBTouchPad.DeadZoneRadius * FBTouchPad.DeadZoneRadius;
  77. [SerializeField]
  78. public UISprite BackgroundSprite;
  79. [SerializeField]
  80. public Transform HintHandle;
  81. [SerializeField]
  82. public UISprite HintSprite;
  83. [SerializeField]
  84. public float Radius;
  85. [SerializeField]
  86. private Vector3 _defaultPosition;
  87. private float _radius;
  88. private Vector2 _anchor;
  89. private Vector2 _lastAnchor;
  90. private float _radiusSqr;
  91. }