由于Unity3d自帶的UGUI不帶拖拽功能,想要實作拖拽功能,必須自己實作拖拽類.是以我寫了一個通用的UGUI拖拽元件,使用友善.
使用方法:
直接放到要拖拽的UI元件上,設定目标移動的對象即可,也可以不設定目标對象,預設是拖動對象自己.
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class DragBase : MonoBehaviour,IPointerDownHandler,IDragHandler{
private Vector2 Local_Pointer_Position;
private Vector3 Panel_Local_Position;
public RectTransform targetObject;
private RectTransform parentRectTransform; //父視窗矩陣
private RectTransform targetRectTransform; //移動目标矩陣
void Awake()
{
if (targetObject == null) {
targetObject=transform as RectTransform;
}
parentRectTransform = targetObject.parent as RectTransform;
targetRectTransform=targetObject as RectTransform;
}
public void OnPointerDown(PointerEventData data)
{
Panel_Local_Position = targetRectTransform.localPosition;
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, data.position, data.pressEventCamera, out Local_Pointer_Position);
targetObject.gameObject.transform.SetAsLastSibling();//保證目前操作的對象能夠優先渲染,即不會被其它對象遮擋住
}
public void OnDrag(PointerEventData data)
{
Vector2 localPointerPosition;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, data.position, data.pressEventCamera, out localPointerPosition))
{
Vector3 offsetToOriginal = localPointerPosition - Local_Pointer_Position;
targetObject.localPosition = Panel_Local_Position + offsetToOriginal;
}
}
}
以下是一個背包拖拽物品基礎類,可以修改了變成可拖拽背包.
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class DragItem : MonoBehaviour,IPointerDownHandler,IDragHandler,IBeginDragHandler,IEndDragHandler {
private Vector2 Local_Pointer_Position;
private Vector3 Panel_Local_Position;
public RectTransform targetObject;
private RectTransform parentRectTransform; //父視窗矩陣
private RectTransform targetRectTransform; //移動目标矩陣
private CanvasGroup canvasgroup;
void Awake()
{
if (targetObject == null) {
targetObject=transform as RectTransform;
}
// CanvasGroup
canvasgroup=GetComponent<CanvasGroup>();
if(!canvasgroup)
canvasgroup=gameObject.AddComponent("CanvasGroup")as CanvasGroup;
//panelRectTransform = transform.parent as RectTransform;
parentRectTransform = targetObject.parent as RectTransform;
targetRectTransform=targetObject as RectTransform;
}
public void OnPointerDown(PointerEventData data)
{
Panel_Local_Position = targetRectTransform.localPosition;
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, data.position, data.pressEventCamera, out Local_Pointer_Position);
targetObject.gameObject.transform.SetAsLastSibling();//保證目前操作的對象能夠優先渲染,即不會被其它對象遮擋住
}
public void OnBeginDrag (PointerEventData eventData)
{
canvasgroup.blocksRaycasts = false;
}
public void OnDrag(PointerEventData data)
{
//if (panelRectTransform == null || parentRectTransform == null)
// return;
//print (data.position);
//檢測到拖拽物品的下放物品.
if (data.pointerEnter != null) {
if(data.pointerEnter.name!="test")
print (data.pointerEnter.name);
}
Vector2 localPointerPosition;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, data.position, data.pressEventCamera, out localPointerPosition))
{
Vector3 offsetToOriginal = localPointerPosition - Local_Pointer_Position;
targetObject.localPosition = Panel_Local_Position + offsetToOriginal;
}
}
public void OnEndDrag (PointerEventData eventData){
canvasgroup.blocksRaycasts = true;
}
}