UI:PointerEventData

PanPan121發表於2021-08-11

   原因:判斷是否將一個UI物體拖放到另一個UI物體上面。

 1.拖拽實現可以直接用EventTrigger元件或者自己實現拖拽事件的介面完成;

 2.在OnDrag方法中藉助PointEventData事件進行檢測;

 3.關於PointEventData的介紹,參考博文:https://blog.csdn.net/qq_41056203/article/details/84875282;

 4.這次檢測主要是靠PointEventData中的pointerEnter屬性完成,該屬性會返回滑鼠滑入的UI物體,返回值為GameObject;

 5.由4可知需要檢測滑鼠的劃入事件,就需要有Image的raycastTarget屬性,raycastTarget代表是否接收UI事件;

 6.當實現拖動時,將自身的Image.raycastTarget設為false。

using UnityEngine.EventSystems;
using UnityEngine.UI;

[RequireComponent(typeof(Image))]//屬性,會給掛在該指令碼的UI強制新增Image元件,且在沒有移除該指令碼時,不能移除Image元件
public class CustomDrag : MonoBehaviour,IDragHandler,IEndDragHandler,IBeginDragHandler//I開頭的為拖拽事件的介面,這選擇實現介面的方法實現拖拽
{
    private Image myImg;//獲取自身的Image元件,在拖動時將raycastTarget設為false
    public void OnDrag(PointerEventData eventData)//拖動時觸發的函式,實時觸發
    {
        print("OnDrag");
      
        Debug.Log(eventData.pointerEnter);//pointerEnter代表滑鼠進入到的UI物體

    }

    public void OnEndDrag(PointerEventData eventData)//拖動結束時觸發的函式,觸發一次
    {
        print("OnEndDrag");
        myImg.raycastTarget = true;
    }

    void IBeginDragHandler.OnBeginDrag(PointerEventData eventData)//拖動開始觸發的函式,觸發一次,需要將自身的raycastTarget設為true。
    {
        print("OnBeginDrag");
        myImg = transform.GetComponent<Image>();

    }
}

這裡要說一下,這裡只是簡單實現拖動函式,沒有實現拖拽時物體跟隨,自己可以憑想法新增自己想要實現的效果,還有就是之所以要將raycastTarget設為false就是當物體拖拽跟隨時,會阻擋下面的物體接收滑鼠事件。

  1.將拖拽事件指令碼掛到目標物體上

    目標物體上記得要有Image元件,可以試試將Text上的Ratcast Target屬性開啟試試。

 

 

 

 

 

 

 

  

相關文章