Unity2D拖动物体笔记
unity拖动物体的方式有很多。
最简单就是检测鼠标的经过,按下和抬起。当鼠标按下时,使得物体跟随着鼠标,也就是两者的位置信息保持一致。
需要注意的是,物体的坐标属于世界坐标,鼠标的坐标属于屏幕坐标,所以需要吧鼠标的坐标信息转换成世界坐标。
private bool isOver = false;
private void Update()
{
if (isOver)
{
Vector2 Pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);//转换成世界坐标
transform.position = new Vector2(Pos.x, Pos.y);
}
}
private void OnMouseOver()
{
if (Input.GetMouseButtonDown(0))
{
isOver = true;
}
if (Input.GetMouseButtonUp(0))
{
isOver = false;
}
不过unity更方便的方法
OnMouseDrag()
它相当于将上面的三个事件结合在一起。
同时设置一个鼠标处于物体上方时,放大物体的方法。做出选择的特效。
使用接口实现UI物体的拖动到格子里。
public class DraagByInterface : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler
{
[SerializeField] private Canvas canvas;
private RectTransform rectTrans;
private CanvasGroup canvasGroup;
private void Start()
{
rectTrans = GetComponent<RectTransform>();
canvasGroup = GetComponent<CanvasGroup>();
}
public void OnBeginDrag(PointerEventData eventData)
{
canvasGroup.blocksRaycasts = false;//使得物体处于格子的上方时,格子能检测到鼠标。
canvasGroup.alpha = 0.35f;
}
public void OnDrag(PointerEventData eventData)
{
rectTrans.anchoredPosition += eventData.delta/canvas.scaleFactor;//利用ui的锚点跟随鼠标移动
}
public void OnEndDrag(PointerEventData eventData)
{
canvasGroup.blocksRaycasts = true;
canvasGroup.alpha = 1f;
}
}
当场景中有多个选框时,通过改变选框的层级,做到当该选框被点击时,显示在最上层。
public void OnPointerDown(PointerEventData eventData)//需要IPointerDownHandler接口
{
panelRectTrans.SetAsLastSibling();
}