using UnityEngine; using UnityEngine.EventSystems; namespace UnityStandardAssets.CrossPlatformInput { public class Joystick : MonoBehaviour, IPointerDownHandler, IEventSystemHandler, IPointerUpHandler, IDragHandler { public enum AxisOption { Both = 0, OnlyHorizontal = 1, OnlyVertical = 2 } public int MovementRange = 100; public AxisOption axesToUse; public string horizontalAxisName = "Horizontal"; public string verticalAxisName = "Vertical"; private Vector3 m_StartPos; private bool m_UseX; private bool m_UseY; private CrossPlatformInputManager.VirtualAxis m_HorizontalVirtualAxis; private CrossPlatformInputManager.VirtualAxis m_VerticalVirtualAxis; private void OnEnable() { CreateVirtualAxes(); } private void Start() { m_StartPos = base.transform.position; } private void UpdateVirtualAxes(Vector3 value) { Vector3 vector = m_StartPos - value; vector.y = 0f - vector.y; vector /= (float)MovementRange; if (m_UseX) { m_HorizontalVirtualAxis.Update(0f - vector.x); } if (m_UseY) { m_VerticalVirtualAxis.Update(vector.y); } } private void CreateVirtualAxes() { m_UseX = axesToUse == AxisOption.Both || axesToUse == AxisOption.OnlyHorizontal; m_UseY = axesToUse == AxisOption.Both || axesToUse == AxisOption.OnlyVertical; if (m_UseX) { m_HorizontalVirtualAxis = new CrossPlatformInputManager.VirtualAxis(horizontalAxisName); CrossPlatformInputManager.RegisterVirtualAxis(m_HorizontalVirtualAxis); } if (m_UseY) { m_VerticalVirtualAxis = new CrossPlatformInputManager.VirtualAxis(verticalAxisName); CrossPlatformInputManager.RegisterVirtualAxis(m_VerticalVirtualAxis); } } public void OnDrag(PointerEventData data) { Vector3 zero = Vector3.zero; if (m_UseX) { int value = (int)(data.position.x - m_StartPos.x); value = Mathf.Clamp(value, -MovementRange, MovementRange); zero.x = value; } if (m_UseY) { int value2 = (int)(data.position.y - m_StartPos.y); value2 = Mathf.Clamp(value2, -MovementRange, MovementRange); zero.y = value2; } base.transform.position = new Vector3(m_StartPos.x + zero.x, m_StartPos.y + zero.y, m_StartPos.z + zero.z); UpdateVirtualAxes(base.transform.position); } public void OnPointerUp(PointerEventData data) { base.transform.position = m_StartPos; UpdateVirtualAxes(m_StartPos); } public void OnPointerDown(PointerEventData data) { } private void OnDisable() { if (m_UseX) { m_HorizontalVirtualAxis.Remove(); } if (m_UseY) { m_VerticalVirtualAxis.Remove(); } } } }