public class DragObject : MonoBehaviour, IDragHandler, IPointerDownHandler, IPointerUpHandler
{
public delegate void PointerEventHandler(PointerEventData eventData);
public event PointerEventHandler PointerDown;
public event PointerEventHandler PointerDrag;
public event PointerEventHandler PointerUp;
#region 无聊代码
RectTransform rtf;
//世界坐标
Vector3 worldPos;
//偏移量
Vector3 offset;
private void Start()
{
//获取RectTransform组件
rtf = this.transform.parent as RectTransform;
}
//当鼠标点击的时候求偏移量
public void OnPointerDown(PointerEventData eventData)
{
//需要将屏幕坐标转换为世界坐标
RectTransformUtility.ScreenPointToWorldPointInRectangle(rtf, eventData.position, eventData.enterEventCamera, out worldPos);
//世界坐标,自身位置
offset = worldPos - this.transform.position;
if (PointerDown != null)
{
PointerDown(eventData);
}
}
/// <summary>
/// 拖拽
/// </summary>
/// <param name="eventData"></param>
public void OnDrag(PointerEventData eventData)
{
//eventData.position你想拖拽到的位置
//可以实现的,但是只能在Overlay模式下可以
//transform.position = eventData.position;
//通用 :我们需要将屏幕坐标转换为世界坐标。
//通过一个方法进行转换,【得到世界坐标】
RectTransformUtility.ScreenPointToWorldPointInRectangle(rtf, eventData.position, eventData.enterEventCamera, out worldPos);
//将得到的世界坐标赋值给transform.position;
transform.position = worldPos - offset;
if (PointerDrag != null)
{
PointerDrag(eventData);
}
}
public void OnPointerUp(PointerEventData eventData)
{
if (PointerUp != null)
{
PointerUp(eventData);
}
}
#endregion
}
/// 1只要放此组件就能实UGUI拖拽
/// 2相关事件自行注册