using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class MoveSiblingItem :MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler { /// <summary> /// 起始父节点 /// </summary> private Transform originalSlot; /// <summary> /// 总列表 /// </summary> private GameObject itemRoot; /// <summary> /// 自身 /// </summary> private GameObject itemSelf; /// <summary> /// 画布 /// </summary> private CanvasGroup itemCanvasGroup; private bool isDragging = false; public string objectTag = null; private int frontIndex = 0; public int itemlevel;//等级 private void Start() { itemCanvasGroup = this.GetComponent<CanvasGroup>(); itemSelf = this.transform.gameObject; itemRoot = GameObject.Find("Content"); } public void OnBeginDrag(PointerEventData eventData) { originalSlot = this.GetComponent<Transform>().parent; isDragging = true; itemCanvasGroup.blocksRaycasts = true; itemSelf.transform.SetParent(itemRoot.transform, false); frontIndex = itemSelf.transform.GetSiblingIndex(); itemSelf.transform.SetAsLastSibling(); itemCanvasGroup.alpha = 0.5f;
RefreshContentSizeFitter(); } public void OnDrag(PointerEventData eventData) { itemCanvasGroup.blocksRaycasts = false; DragPos(eventData); } public void OnEndDrag(PointerEventData eventData) { OnPointerEnter(eventData); itemCanvasGroup.blocksRaycasts = true; itemCanvasGroup.alpha = 1; isDragging = false; } public void OnPointerEnter(PointerEventData eventData) { if (eventData.pointerCurrentRaycast.depth == 0 && isDragging == true) { SetLastPos(); return; } objectTag = eventData.pointerCurrentRaycast.gameObject.tag; if (objectTag != null && isDragging == true) { Debug.Log("放置位置:" + eventData.pointerCurrentRaycast.gameObject.name); MoveSiblingItem hitItem = eventData.pointerCurrentRaycast.gameObject.GetComponent<MoveSiblingItem>(); if (hitItem != null) { if (itemlevel <= hitItem.itemlevel) { Transform aimParent = eventData.pointerCurrentRaycast.gameObject.transform.parent; while (true) { MoveSiblingItem aimParentSiblingItem = aimParent.GetComponent<MoveSiblingItem>(); if (aimParentSiblingItem == null) { break; } else { if (itemlevel > aimParentSiblingItem.itemlevel) { break; } else { hitItem = aimParentSiblingItem; aimParent = aimParent.parent; } } } itemSelf.transform.SetParent(aimParent); itemSelf.transform.SetSiblingIndex(hitItem.transform.GetSiblingIndex()); } else { itemSelf.transform.SetParent(eventData.pointerCurrentRaycast.gameObject.transform); } RefreshContentSizeFitter(); } else { SetOriginalPos(itemSelf); } } } public void RefreshContentSizeFitter() { ContentSizeFitter[] csfs = itemRoot.GetComponentsInChildren<ContentSizeFitter>(); foreach (var item in csfs) { LayoutRebuilder.ForceRebuildLayoutImmediate(item.GetComponent<RectTransform>()); } } public void SetLastPos() { itemSelf.transform.SetParent(itemRoot.transform); RefreshContentSizeFitter(); } public void SetOriginalPos(GameObject gameobject) { gameobject.transform.SetParent(originalSlot.transform); if (itemSelf.transform.GetSiblingIndex()== frontIndex) { itemSelf.transform.SetSiblingIndex(0); itemSelf.transform.SetSiblingIndex(frontIndex); } else { itemSelf.transform.SetSiblingIndex(frontIndex); } RefreshContentSizeFitter(); } //获取鼠标当前位置,并赋给item private void DragPos(PointerEventData eventData) { RectTransform RectItem = itemSelf.GetComponent<RectTransform>(); Vector3 globalMousePos; if (RectTransformUtility.ScreenPointToWorldPointInRectangle(itemSelf.transform as RectTransform, eventData.position, eventData.pressEventCamera, out globalMousePos)) { RectItem.position = globalMousePos; } } }
这样就可以拖拽了!