diff --git a/Assets/Joystick Pack/Scripts/Base/Joystick.cs b/Assets/Joystick Pack/Scripts/Base/Joystick.cs index 6d271d6332..f3f8ac27f9 100644 --- a/Assets/Joystick Pack/Scripts/Base/Joystick.cs +++ b/Assets/Joystick Pack/Scripts/Base/Joystick.cs @@ -6,8 +6,8 @@ using UnityEngine.EventSystems; public class Joystick : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandler { - public float Horizontal { get { return (snapX) ? SnapFloat(input.x, AxisOptions.Horizontal) : input.x; } } - public float Vertical { get { return (snapY) ? SnapFloat(input.y, AxisOptions.Vertical) : input.y; } } + public float Horizontal { get { return SnapToDiscrete(input.x); } } + public float Vertical { get { return SnapToDiscrete(input.y); } } public Vector2 Direction { get { return new Vector2(Horizontal, Vertical); } } public float HandleRange @@ -40,6 +40,7 @@ public class Joystick : MonoBehaviour, IPointerDownHandler, IDragHandler, IPoint private Camera cam; private Vector2 input = Vector2.zero; + private Vector2 previousSnappedInput = Vector2.zero; protected virtual void Start() { @@ -60,8 +61,8 @@ public class Joystick : MonoBehaviour, IPointerDownHandler, IDragHandler, IPoint public virtual void OnPointerDown(PointerEventData eventData) { + previousSnappedInput = Vector2.zero; OnDrag(eventData); - EventBus.Publish(new JoystickPressEvent()); } public void OnDrag(PointerEventData eventData) @@ -76,6 +77,18 @@ public class Joystick : MonoBehaviour, IPointerDownHandler, IDragHandler, IPoint FormatInput(); HandleInput(input.magnitude, input.normalized, radius, cam); handle.anchoredPosition = input * radius * handleRange; + + // Send event when value changes to -1 or 1 + Vector2 currentSnapped = new Vector2(Horizontal, Vertical); + if ((currentSnapped.x == -1 || currentSnapped.x == 1 || currentSnapped.y == -1 || currentSnapped.y == 1) && + currentSnapped != previousSnappedInput) + { + EventBus.Publish(new JoystickPressEvent()); + } + else if (currentSnapped == Vector2.zero && previousSnappedInput != Vector2.zero) { + EventBus.Publish(new JoystickRealeaseEvent()); + } + previousSnappedInput = currentSnapped; } protected virtual void HandleInput(float magnitude, Vector2 normalised, Vector2 radius, Camera cam) @@ -97,6 +110,14 @@ public class Joystick : MonoBehaviour, IPointerDownHandler, IDragHandler, IPoint input = new Vector2(0f, input.y); } + private float SnapToDiscrete(float value) + { + // Snap to -1, 1, or 0 + if (value == 0) + return 0; + return value > 0 ? 1 : -1; + } + private float SnapFloat(float value, AxisOptions snapAxis) { if (value == 0) @@ -135,6 +156,7 @@ public class Joystick : MonoBehaviour, IPointerDownHandler, IDragHandler, IPoint { input = Vector2.zero; handle.anchoredPosition = Vector2.zero; + previousSnappedInput = Vector2.zero; EventBus.Publish(new JoystickRealeaseEvent()); }