UGUI脚本记录

/*******************************************************************
* 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;
        }
    }


    
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值