using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class JoyStickS : MonoBehaviour
{
public class JoystickInputS
{
public Quaternion Quaternion;
public float Distance;
public float MaxDistance;
}
public JoystickInputS inputS;
public int MaxDistance = 100;
public Image Mover;
public Camera uiCamera;
private Vector3 StartPos;
private Vector2 FirstPos;
private Vector2 dir;
private bool isDownFirst = false;
private RectTransform thisRT;
private RectTransform baseRect;
private void Awake()
{
inputS = new JoystickInputS();
inputS.MaxDistance = MaxDistance;
StartPos = transform.localPosition;
thisRT = GetComponent<RectTransform>();
baseRect = transform.parent.GetComponent<RectTransform>();
}
public float GetDistance()
{
return inputS.Distance;
}
public Vector2 GetValue()
{
return dir;
}
private void Update()
{
if (!IsClickOverUI())
{
if (Input.GetKeyDown(KeyCode.Mouse0))
{
OnPointerDown(new Vector2(Input.mousePosition.x, Input.mousePosition.y));
}
}
if (Input.GetKey(KeyCode.Mouse0))
{
OnDrag(new Vector2(Input.mousePosition.x, Input.mousePosition.y));
}
if (Input.GetKeyUp(KeyCode.Mouse0))
{
OnPointerUp();
}
}
private void OnPointerDown(Vector2 mousePos)
{
FirstPos = mousePos;
thisRT.anchoredPosition = ScreenPointToAnchoredPosition(mousePos);
isDownFirst = true;
}
private Vector2 ScreenPointToAnchoredPosition(Vector2 screenPosition)
{
Vector2 localPoint = Vector2.zero;
RectTransformUtility.ScreenPointToLocalPointInRectangle(baseRect, screenPosition, uiCamera, out localPoint);
return localPoint;
}
private void OnDrag(Vector2 DragPos)
{
if (!isDownFirst)
{
return;
}
dir = (DragPos - FirstPos).normalized;
if (dir != Vector2.zero)
{
inputS.Quaternion = Quaternion.LookRotation(dir, Vector3.back);
inputS.Distance = Mathf.Clamp(Vector3.Distance(DragPos, FirstPos), 0, inputS.MaxDistance);
if (Mover != null)
{
Mover.transform.localPosition = inputS.Quaternion * Vector3.forward * inputS.Distance;
}
}
}
private void OnPointerUp()
{
inputS.Distance = 0;
if (Mover != null)
{
Mover.transform.localPosition = Vector3.zero;
}
transform.localPosition = StartPos;
isDownFirst = false;
}
private bool IsClickOverUI()
{
bool pointerOverUI = false;
#if UNITY_EDITOR
pointerOverUI = EventSystem.current.IsPointerOverGameObject();
#elif UNITY_ANDROID || UNITY_IOS
if (Input.touchCount > 0)
{
pointerOverUI = EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId);
}
#endif
return pointerOverUI;
}
}
可以获取朝向,距离,点哪出现在那。
一个需要注意的点是,摇杆的相关Image的射线点击要取消勾选。