最近学习,碰到个移动滑杆控制操作的代码,写的不错,在这里和大家分享一下
UI:
首先用UGUI创建个滑杆
做好UI,添加个脚本,脚本中需要实现三个接口分别是:
功能主要是实现拖拽和起始、结束时所触发的事件,具体可以在官网了解一下。
- 滑杆要实现的功能有滑杆会出现手点击屏幕的位置,中心点(即控制角色移动)会随拖拽而移动,手离开屏幕滑杆会归回原位。
代码实现如下:
public class TouchDrag : MonoBehaviour, IDragHandler,IPointerDownHandler,IPointerUpHandler
{
public Transform touchPoint;
public Transform touchBg;
private Vector2 startPos;
private float pointDis;//滑杆半径
private void Update()
{
//这一步是为了解决滑杆半径可能会随屏幕变化而改变的自适应操作
//我的前面文章也有类似的介绍
pointDis = Screen.height * 1.0f /
Constants.ScreenStandardHeight * Constants.ScreenOPDis;
}
public void OnDrag(PointerEventData eventData)
{
//半径长度
Vector2 r = eventData.position-(Vector2)touchBg.position;
float len = r.magnitude;
//中心点是否超过滑杆半径
//超过则做出限制
if(len>pointDis)
{
r = Vector2.ClampMagnitude(r, pointDis);
touchPoint.position = (Vector2)touchBg.position + r;
}
else
{
//没有超出圆盘,正常赋值触碰位置
touchPoint.position = eventData.position;
}
}
public void OnPointerDown(PointerEventData eventData)
{
/* 这里可以看出eventData.position的坐标和Input.mousePosition是相同的
Debug.Log("Evenpos: " + eventData.position);
Debug.Log("Mousepos: " + Input.mousePosition);
*/
startPos = touchBg.position;
touchBg.position = eventData.position;
}
public void OnPointerUp(PointerEventData eventData)
{
//结束 将圆盘归位
touchPoint.localPosition = Vector3.zero;
touchBg.position = startPos;
}
}
上述代码已给出详细注释。自适应那里,如果是按一定分辨率播放的话,可以不做处理直接赋值半径长度即可。 主要是拖拽时的处理让人头凉,这种处理应该还不错。