/*******************************************************************
* Summary: UGUI拖拽脚本
* Author :
* Date :
*******************************************************************/
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using System;
public delegate void GameEvent(object para);
public class DragDropItem : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler,IPointerClickHandler
{
public bool canDrag = true;
public bool dragClone = true;
public GameObject originObj = null;
public GameObject parentObj = null;
private GameObject m_DragObj;
private RectTransform m_DragPlane;
public Action<object> onDragStart;
public Action<object> onDragEnd;
public Action<object> onClick;
public void OnBeginDrag(PointerEventData eventData)
{
if (!canDrag)
return;
var canvas = Util.FindInParents<Canvas>(gameObject);
if (canvas == null)
return;
if (dragClone)
{
m_DragObj = Instantiate(gameObject) as GameObject;
m_DragObj.GetComponent<DragDropItem>().originObj = gameObject;
m_DragObj.GetComponent<DragDropItem>().dragClone = false;
}
else
{
m_DragObj = gameObject;
}
m_DragObj.GetComponent<DragDropItem>().parentObj = transform.parent.gameObject;
m_DragObj.transform.SetParent(canvas.transform, false);
m_DragObj.transform.SetAsLastSibling();
CanvasGroup group = m_DragObj.GetComponent<CanvasGroup>();
if (group == null)
group = m_DragObj.AddComponent<CanvasGroup>();
group.blocksRaycasts = false;
m_DragPlane = canvas.transform as RectTransform;
SetDraggedPosition(eventData);
if(onDragStart!=null)
{
onDragStart(new object[] { m_DragObj, transform.parent.gameObject });
}
}
public void OnDrag(PointerEventData data)
{
if (!canDrag)
return;
if (m_DragObj != null)
{
SetDraggedPosition(data);
}
}
public void OnEndDrag(PointerEventData eventData)
{
if (!canDrag)
return;
if (m_DragObj != null)
{
GameObject target=null;
RaycastResult rr = eventData.pointerCurrentRaycast;
if (rr.gameObject != null)
{
if (rr.gameObject.GetComponent<DropContainer>() != null)//直接放上去
{
target = rr.gameObject;
}
// else if (rr.gameObject.GetComponent<BaseItem>() != null)//替换
// {
// target = rr.gameObject;
// }
}
if (onDragEnd != null)
{
onDragEnd(new object[] { m_DragObj, target });
m_DragObj = null;
}
else
{
Destroy(m_DragObj);
}
}
}
public void OnPointerClick(PointerEventData eventData)
{
if (!canDrag)
return;
if (m_DragObj != null)
return;
GameObject target = eventData.pointerPress;
if (onClick != null)
{
onClick(new object[] { target });
}
}
private void SetDraggedPosition(PointerEventData data)
{
var rt = m_DragObj.GetComponent<RectTransform>();
Vector3 globalMousePos;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(m_DragPlane, data.position, data.pressEventCamera, out globalMousePos))
{
rt.position = globalMousePos;
rt.rotation = m_DragPlane.rotation;
rt.localScale = Vector3.one * 0.9f;
}
}
}
UGUI脚本记录
最新推荐文章于 2022-10-29 00:02:43 发布