ui方面
关键就是将屏幕坐标转换为ui坐标
要注意的是想摇杆中间的点在点击时保持正确位置就要将点和背景放在同一级目录下分别设置位置
代码部分:
void Update()
{
bool pressing;
Vector2 pos;
if (Application.isEditor)
GetPressingInfoInEditor(out pressing, out pos);
else
GetPressingInfoInPhone(out pressing, out pos);
SetIcon(pressing, pos);
}
#region 摇杆控制
void GetPressingInfoInEditor(out bool pressing, out Vector2 pos)
{
if (Input.GetMouseButton(0))
{
pressing = true;
Vector2 uiPos = Vector3.one;
RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform,
Input.mousePosition, UICamera, out uiPos);
pos = uiPos;
}
else
{
pressing = false;
pos = Vector3.zero;
}
}
void GetPressingInfoInPhone(out bool pressing, out Vector2 pos)
{
if (Input.touchCount > 0)
{
pressing = true;
Vector2 uiPos = Vector3.one;
RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform,
Input.mousePosition, UICamera, out uiPos);
pos = uiPos;
}
else
{
pressing = false;
pos = Vector3.zero;
}
}
void SetIcon(bool pressing, Vector2 pos)
{
if (pressing)
{
if (!isPressing)
{
trans_Controller.gameObject.SetActive(true);
trans_Bg.anchoredPosition = pos;
trans_DirGo.anchoredPosition = pos;
centerPos = trans_DirGo.anchoredPosition;
isPressing = true;
}
else
{
SetTouchPointPos(pos);
}
}
else
{
trans_Controller.gameObject.SetActive(false);
isPressing = false;
}
}
void SetTouchPointPos(Vector2 pos)
{
Vector2 touch = pos;
Vector2 to;
float distance = Vector2.Distance(centerPos, touch);
if (distance < radius)
to = touch;
else
{
Vector2 dir = touch - centerPos;
dir.Normalize();
to = dir * radius;
to += centerPos;
}
trans_DirGo.anchoredPosition = to;
}
#endregion
本文参考https://blog.csdn.net/qq_33205561/article/details/89028711