Files
2026-02-21 16:45:37 +08:00

116 lines
2.6 KiB
C#

using UnityEngine;
using UnityEngine.EventSystems;
namespace UnityStandardAssets.CrossPlatformInput
{
public class Joystick : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler, IEventSystemHandler
{
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();
}
}
}
}