diff options
| author | Andrew Lee <alee14498@protonmail.com> | 2020-08-20 23:40:50 -0400 |
|---|---|---|
| committer | Andrew Lee <alee14498@protonmail.com> | 2020-08-20 23:40:50 -0400 |
| commit | 3af4c218c0e70167db23a6303d2af30aff37d2fe (patch) | |
| tree | 927f29edcf54ab562f40f3d1c6cb69287c7f5980 /Assets/Thirdparty/Joystick Pack/Scripts/Base/Joystick.cs | |
| parent | b6daed0af784f4e9bc13329dd87c671b06ee1c65 (diff) | |
| download | Project-Sandbox-3af4c218c0e70167db23a6303d2af30aff37d2fe.tar.gz Project-Sandbox-3af4c218c0e70167db23a6303d2af30aff37d2fe.tar.bz2 Project-Sandbox-3af4c218c0e70167db23a6303d2af30aff37d2fe.zip | |
Removed a bunch of stuff; Changes
Diffstat (limited to 'Assets/Thirdparty/Joystick Pack/Scripts/Base/Joystick.cs')
| -rw-r--r-- | Assets/Thirdparty/Joystick Pack/Scripts/Base/Joystick.cs | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/Assets/Thirdparty/Joystick Pack/Scripts/Base/Joystick.cs b/Assets/Thirdparty/Joystick Pack/Scripts/Base/Joystick.cs new file mode 100644 index 0000000..656d714 --- /dev/null +++ b/Assets/Thirdparty/Joystick Pack/Scripts/Base/Joystick.cs @@ -0,0 +1,150 @@ +using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+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 Vector2 Direction { get { return new Vector2(Horizontal, Vertical); } }
+
+ public float HandleRange
+ {
+ get { return handleRange; }
+ set { handleRange = Mathf.Abs(value); }
+ }
+
+ public float DeadZone
+ {
+ get { return deadZone; }
+ set { deadZone = Mathf.Abs(value); }
+ }
+
+ public AxisOptions AxisOptions { get { return AxisOptions; } set { axisOptions = value; } }
+ public bool SnapX { get { return snapX; } set { snapX = value; } }
+ public bool SnapY { get { return snapY; } set { snapY = value; } }
+
+ [SerializeField] private float handleRange = 1;
+ [SerializeField] private float deadZone = 0;
+ [SerializeField] private AxisOptions axisOptions = AxisOptions.Both;
+ [SerializeField] private bool snapX = false;
+ [SerializeField] private bool snapY = false;
+
+ [SerializeField] protected RectTransform background = null;
+ [SerializeField] private RectTransform handle = null;
+ private RectTransform baseRect = null;
+
+ private Canvas canvas;
+ private Camera cam;
+
+ private Vector2 input = Vector2.zero;
+
+ protected virtual void Start()
+ {
+ HandleRange = handleRange;
+ DeadZone = deadZone;
+ baseRect = GetComponent<RectTransform>();
+ canvas = GetComponentInParent<Canvas>();
+ if (canvas == null)
+ Debug.LogError("The Joystick is not placed inside a canvas");
+
+ Vector2 center = new Vector2(0.5f, 0.5f);
+ background.pivot = center;
+ handle.anchorMin = center;
+ handle.anchorMax = center;
+ handle.pivot = center;
+ handle.anchoredPosition = Vector2.zero;
+ }
+
+ public virtual void OnPointerDown(PointerEventData eventData)
+ {
+ OnDrag(eventData);
+ }
+
+ public void OnDrag(PointerEventData eventData)
+ {
+ cam = null;
+ if (canvas.renderMode == RenderMode.ScreenSpaceCamera)
+ cam = canvas.worldCamera;
+
+ Vector2 position = RectTransformUtility.WorldToScreenPoint(cam, background.position);
+ Vector2 radius = background.sizeDelta / 2;
+ input = (eventData.position - position) / (radius * canvas.scaleFactor);
+ FormatInput();
+ HandleInput(input.magnitude, input.normalized, radius, cam);
+ handle.anchoredPosition = input * radius * handleRange;
+ }
+
+ protected virtual void HandleInput(float magnitude, Vector2 normalised, Vector2 radius, Camera cam)
+ {
+ if (magnitude > deadZone)
+ {
+ if (magnitude > 1)
+ input = normalised;
+ }
+ else
+ input = Vector2.zero;
+ }
+
+ private void FormatInput()
+ {
+ if (axisOptions == AxisOptions.Horizontal)
+ input = new Vector2(input.x, 0f);
+ else if (axisOptions == AxisOptions.Vertical)
+ input = new Vector2(0f, input.y);
+ }
+
+ private float SnapFloat(float value, AxisOptions snapAxis)
+ {
+ if (value == 0)
+ return value;
+
+ if (axisOptions == AxisOptions.Both)
+ {
+ float angle = Vector2.Angle(input, Vector2.up);
+ if (snapAxis == AxisOptions.Horizontal)
+ {
+ if (angle < 22.5f || angle > 157.5f)
+ return 0;
+ else
+ return (value > 0) ? 1 : -1;
+ }
+ else if (snapAxis == AxisOptions.Vertical)
+ {
+ if (angle > 67.5f && angle < 112.5f)
+ return 0;
+ else
+ return (value > 0) ? 1 : -1;
+ }
+ return value;
+ }
+ else
+ {
+ if (value > 0)
+ return 1;
+ if (value < 0)
+ return -1;
+ }
+ return 0;
+ }
+
+ public virtual void OnPointerUp(PointerEventData eventData)
+ {
+ input = Vector2.zero;
+ handle.anchoredPosition = Vector2.zero;
+ }
+
+ protected Vector2 ScreenPointToAnchoredPosition(Vector2 screenPosition)
+ {
+ Vector2 localPoint = Vector2.zero;
+ if (RectTransformUtility.ScreenPointToLocalPointInRectangle(baseRect, screenPosition, cam, out localPoint))
+ {
+ Vector2 pivotOffset = baseRect.pivot * baseRect.sizeDelta;
+ return localPoint - (background.anchorMax * baseRect.sizeDelta) + pivotOffset;
+ }
+ return Vector2.zero;
+ }
+}
+
+public enum AxisOptions { Both, Horizontal, Vertical }
\ No newline at end of file |
