看啥推荐读物
专栏名称: Week233
做一个无聊的人,做一些有趣的事,劈柴🎄、喂马...
今天看啥  ›  专栏  ›  Week233

Unity 制作简易虚拟摇杆

Week233  · 简书  ·  · 2019-08-03 14:33

计算方法

制作摇杆有两个需要考虑的点:

  1. 摇杆跟随鼠标移动
  2. 松开鼠标后,摇杆位置归为初始位置。
  3. 摇杆的移动范围要在圆盘内。

第一个点,只需要继承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");
}



原文地址:访问原文地址
快照地址: 访问文章快照