原因:判斷是否將一個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屬性開啟試試。