簡單記錄,方便使用
創建好背包格子
格子的tag值需要設置成Grid 物品tag值需要設置成 Good (自己設置成什么都行) 設置其他參數 需要在腳本中修改
下面上代碼 一個繼承 MonoBehaviour 一個繼承 Button
第一種
using System; using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; using UnityEngine.UI; /// <summary> /// 本腳本掛在物品上運行即可 /// </summary> public class DragImage : MonoBehaviour { private Transform beginParentTransform; //記錄開始拖動時的父級對象 private Transform canvasParent; private EventTrigger trigger; // Use this for initialization void Start() { canvasParent = GameObject.Find("Canvas").transform; if (!GetComponent<EventTrigger>()) { trigger = gameObject.AddComponent<EventTrigger>(); } else { trigger = gameObject.GetComponent<EventTrigger>(); } //開始拖拽的事件 UnityAction<BaseEventData> click = new UnityAction<BaseEventData>(Begin); EventTrigger.Entry myclick = new EventTrigger.Entry(); myclick.eventID = EventTriggerType.BeginDrag; myclick.callback.AddListener(click); trigger.triggers.Add(myclick); //拖拽中的事件 UnityAction<BaseEventData> _click = new UnityAction<BaseEventData>(OnDrag); EventTrigger.Entry myclick_ = new EventTrigger.Entry(); myclick_.eventID = EventTriggerType.Drag; myclick_.callback.AddListener(_click); trigger.triggers.Add(myclick_); //結束拖拽的事件 UnityAction<BaseEventData> Endclick = new UnityAction<BaseEventData>(End); EventTrigger.Entry Endclick_ = new EventTrigger.Entry(); Endclick_.eventID = EventTriggerType.EndDrag; Endclick_.callback.AddListener(Endclick); trigger.triggers.Add(Endclick_); } /// <summary> /// 開始拖動時 /// </summary> public void Begin(BaseEventData data) { if (transform.parent == canvasParent) return; beginParentTransform = transform.parent; transform.SetParent(canvasParent); } /// <summary> /// 拖動中 /// </summary> /// <param name="e">UI事件數據</param> public void OnDrag(BaseEventData e) { transform.position = Input.mousePosition; if (transform.GetComponent<Image>().raycastTarget) transform.GetComponent<Image>().raycastTarget = false; } /// <summary> /// 結束時 /// </summary> public void End(BaseEventData data) { PointerEventData e = data as PointerEventData; if (e == null) return; GameObject target = e.pointerCurrentRaycast.gameObject; if (target.tag == "Grid") //如果當前拖動物體下是:格子(沒有物品)時 { SetPos_Parent(transform, target.transform); transform.GetComponent<Image>().raycastTarget = true; } else if (target.tag == "Good") //如果是物品 { SetPos_Parent(transform, target.transform.parent); //將當前拖動物品設置到目標位置 target.transform.SetParent(canvasParent); //目標物品設置到 UI 頂層 SetPos_Parent(target.transform, beginParentTransform); //再將目標物品設置到開始拖動物品的父物體 來完成物品的切換 transform.GetComponent<Image>().raycastTarget = true; } else //其他任何情況,物體回歸原始位置 { SetPos_Parent(transform, beginParentTransform); transform.GetComponent<Image>().raycastTarget = true; } } /// <summary> /// 設置父物體,UI位置歸正 /// </summary> /// <param name="targetods">對象Transform</param> /// <param name="parent">要設置到的父級</param> private void SetPos_Parent(Transform targetods, Transform parent) { targetods.SetParent(parent); targetods.position = parent.position; } }
第一種實現來回拖拽的效果,可以相互替換
擴展(實現在背包里拖拽到其他固定地方,在從其他地方拖到背包)

using System; using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; using UnityEngine.UI; /// <summary> /// 本腳本掛在物品上運行即可 /// </summary> public class DragImage : MonoBehaviour { public Transform targerTransform; //目標位置 private Transform beginParentTransform; //記錄開始拖動時的父級對象 private Transform canvasParent; private EventTrigger trigger; // Use this for initialization void Start() { canvasParent = GameObject.Find("Canvas").transform; if (!GetComponent<EventTrigger>()) { trigger = gameObject.AddComponent<EventTrigger>(); } else { trigger = gameObject.GetComponent<EventTrigger>(); } //開始拖拽的事件 UnityAction<BaseEventData> click = new UnityAction<BaseEventData>(Begin); EventTrigger.Entry myclick = new EventTrigger.Entry(); myclick.eventID = EventTriggerType.BeginDrag; myclick.callback.AddListener(click); trigger.triggers.Add(myclick); //拖拽中的事件 UnityAction<BaseEventData> _click = new UnityAction<BaseEventData>(OnDrag); EventTrigger.Entry myclick_ = new EventTrigger.Entry(); myclick_.eventID = EventTriggerType.Drag; myclick_.callback.AddListener(_click); trigger.triggers.Add(myclick_); //結束拖拽的事件 UnityAction<BaseEventData> Endclick = new UnityAction<BaseEventData>(End); EventTrigger.Entry Endclick_ = new EventTrigger.Entry(); Endclick_.eventID = EventTriggerType.EndDrag; Endclick_.callback.AddListener(Endclick); trigger.triggers.Add(Endclick_); } /// <summary> /// 開始拖動時 /// </summary> public void Begin(BaseEventData data) { //if (transform.parent == canvasParent) return; beginParentTransform = transform.parent; transform.SetParent(canvasParent); } /// <summary> /// 拖動中 /// </summary> /// <param name="e">UI事件數據</param> public void OnDrag(BaseEventData e) { transform.position = Input.mousePosition; if (transform.GetComponent<Image>().raycastTarget) transform.GetComponent<Image>().raycastTarget = false; // Debug.Log(e); } /// <summary> /// 結束時 /// </summary> public void End(BaseEventData data) { PointerEventData e = data as PointerEventData; if (e == null) return; GameObject target = e.pointerCurrentRaycast.gameObject; if (transform.parent == canvasParent) { SetPos_Parent(transform, beginParentTransform); transform.GetComponent<Image>().raycastTarget = true; } if (target.tag == "Grid"&& target.name == this.name|| target.tag == "Grid" && target.name =="Grid") //如果當前拖動物體下是:格子(沒有物品)時 { SetPos_Parent(transform, target.transform); transform.GetComponent<Image>().raycastTarget = true; } else if (target.tag == "Good") //如果是物品 { SetPos_Parent(transform, target.transform.parent); //將當前拖動物品設置到目標位置 target.transform.SetParent(canvasParent); //目標物品設置到 UI 頂層 SetPos_Parent(target.transform, beginParentTransform); //再將目標物品設置到開始拖動物品的父物體 來完成物品的切換 transform.GetComponent<Image>().raycastTarget = true; } else //其他任何情況,物體回歸原始位置 { SetPos_Parent(transform, beginParentTransform); transform.GetComponent<Image>().raycastTarget = true; } } /// <summary> /// 設置父物體,UI位置歸正 /// </summary> /// <param name="targetods">對象Transform</param> /// <param name="parent">要設置到的父級</param> private void SetPos_Parent(Transform targetods, Transform parent) { targetods.SetParent(parent); targetods.position = parent.position; } }
第二種
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System; namespace DragAmer.UI { //繼承button 掛在物品上即可 需要其他功能請自行添加 public class CongDragSwapImage : Button, IDragHandler, IBeginDragHandler, IEndDragHandler { private Transform beginParentTransform; //記錄開始拖動時的父級對象 private Transform canvasParent; protected override void Start() { base.Start(); canvasParent = GameObject.Find("Canvas").transform; } public void OnBeginDrag(PointerEventData _) { if (transform.parent == canvasParent) return; beginParentTransform = transform.parent; transform.SetParent(canvasParent); } public void OnDrag(PointerEventData _) { transform.position = Input.mousePosition; if (transform.GetComponent<Image>().raycastTarget) transform.GetComponent<Image>().raycastTarget = false; } public void OnEndDrag(PointerEventData e) { GameObject target = e.pointerCurrentRaycast.gameObject; if (target.tag == "Grid") //如果當前拖動物體下是:格子(沒有物品)時 { SetPos_Parent(transform, target.transform); transform.GetComponent<Image>().raycastTarget = true; } else if (target.tag == "Good") //如果目標是物品 { SetPos_Parent(transform, target.transform.parent); //將當前拖動物品設置到目標位置 target.transform.SetParent(canvasParent); //目標物品設置到 UI 頂層 SetPos_Parent(target.transform, beginParentTransform); //再將目標物品設置到開始拖動物品的父物體 來完成物品的切換 transform.GetComponent<Image>().raycastTarget = true; } else //其他任何情況,物體回歸原始位置 { SetPos_Parent(transform, beginParentTransform); transform.GetComponent<Image>().raycastTarget = true; } } /// <summary> /// 設置父物體,UI位置歸正 /// </summary> /// <param name="targetods">對象Transform</param> /// <param name="parent">要設置到的父級</param> private void SetPos_Parent(Transform targetods, Transform parent) { targetods.SetParent(parent); targetods.position = parent.position; } } }
end