首先可拖拽实现其实很简单,不过网上代码大多都是基于Overly来实现的,在Camera下最直观的感觉就是鼠标移动过快物体会消失,或者甚至是失灵,下面贴出我调试成功的代码,实现了可以按住消息框的页眉来移动:
public class Drag : MonoBehaviour, IDragHandler,IPointerDownHandler
{
public RectTransform rectTransform;
private Vector3 _pot;
private Vector3 _open;
private Vector3 _init;
// Start is called before the first frame update
private void Awake()
{
var position = rectTransform.position;
_pot = position - gameObject.GetComponent<RectTransform>().position;
_init = position;
}
public void OnPointerDown(PointerEventData eventData)
{
RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, eventData.position, Camera.main, out var pos);
_open = gameObject.GetComponent<RectTransform>().position - pos;
}
public void OnDrag(PointerEventData eventData)
{
RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, eventData.position, Camera.main, out var pos);
rectTransform.position = pos + _pot + _open;
}
public void Init()
{
rectTransform.position = _init;
}
}