您的位置:首页 > 产品设计 > UI/UE

UGUI脚本记录

2016-01-04 09:34 477 查看
/*******************************************************************
* 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;
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: