using UnityEngine; public class Joystick : MonoBehaviour { [SerializeField] private RectTransform center; [SerializeField] private RectTransform knob; [SerializeField] private float range; [SerializeField] private bool fixedJoystick; public Vector2 Direction { get; private set; } private GameObject StickCenter => center.gameObject; private GameObject StickKnob => knob.gameObject; private bool _isRunning; public void RunSystem() { HideJoystick(); _isRunning = true; } public void PauseSystem() => _isRunning = false; private void Update() { if (!_isRunning) return; var pointerPosition = Input.mousePosition; if (Input.GetMouseButtonDown(0)) { ShowJoystick(); knob.position = pointerPosition; center.position = pointerPosition; return; } if (Input.GetMouseButton(0)) { knob.position = center.position + Vector3.ClampMagnitude(pointerPosition - center.position, center.sizeDelta.x * range); if (knob.position != Input.mousePosition && !fixedJoystick) { var outsideBoundsVector = Input.mousePosition - knob.position; center.position += outsideBoundsVector; } Direction = (knob.position - center.position).normalized; return; } if (Input.GetMouseButtonUp(0)) { HideJoystick(); Direction = Vector2.zero; } } private void ShowJoystick() { StickCenter.SetActive(true); StickKnob.SetActive(true); } private void HideJoystick() { StickCenter.SetActive(false); StickKnob.SetActive(false); } }