计算方法
制作摇杆有两个需要考虑的点:
- 摇杆跟随鼠标移动
- 松开鼠标后,摇杆位置归为初始位置。
- 摇杆的移动范围要在圆盘内。
第一个点,只需要继承IDragHandler
接口,实现鼠标拖拽回调方法就可以了。
第二个点也是,继承IEndHandler
,在实现回调方法时,将摇杆位置设为圆盘的位置就可以了。
第三个点,需要有一定的计算方法。
当鼠标在圆盘内时
直接将摇杆的位置置为鼠标的位置即可。
当鼠标在圆盘外时,需要计算一下。
如图所示,a点为鼠标位置,o点为圆盘中心点位置,b点为oa向量与圆盘边缘的交点。此时的b位置,即为摇杆的位置。
先计算一下ob向量,ob向量=oa向量的单位向量*圆盘的半径r。
知道ob向量的值再计算b的位置。ob=o-b,所以b=ob+o。
代码实现
//中心点
Transform center;
//摇杆移动向量
Vector3 dir;
//摇杆移动最大距离
float distance;
//圆盘的位置
RectTransform rectTransform;
public void OnDrag(PointerEventData eventData)
{
//获取圆位置到鼠标位置的向量
dir = Input.mousePosition - rectTransform.position;
//当鼠标位置在圆盘内时,直接移动
if (Mathf.Pow(distance, 2) >= dir.sqrMagnitude)
{
center.position = Input.mousePosition;
}
//鼠标不在圆盘内时
else
{
//向量=圆盘位置到鼠标位置的向量的单位向量*圆盘的半径
dir = dir.normalized * distance;
//移动摇杆
center.position =dir+transform.position;
}
}
/// <summary>
/// 鼠标松开时,摇杆归位
/// </summary>
/// <param name="eventData"></param>
public void OnEndDrag(PointerEventData eventData)
{
center.position = transform.position;
}
private void Awake()
{
rectTransform = GetComponent<RectTransform>();
//获取圆盘中心到圆盘边缘的距离
distance = rectTransform.sizeDelta.x / 2;
Debug.Log("圆盘半径"+distance);
center = transform.Find("Button");
}