// *********************************************************************** // Assembly : Unity // Author : KimCh // Created : // // Last Modified By : KimCh // Last Modified On : // *********************************************************************** // // // *********************************************************************** using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class KDraggable : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler { public UnityEngine.Events.UnityEvent onDragEnd = new UnityEngine.Events.UnityEvent(); [HideInInspector] public Transform parentToReturnTo = null; [HideInInspector] public Transform placeHolderParent = null; private GameObject _placeHolder = null; private LayoutElement _layoutElement; private void Awake() { _layoutElement = GetComponent(); } public void OnBeginDrag(PointerEventData eventData) { _placeHolder = new GameObject(); _placeHolder.transform.SetParent(this.transform.parent); var le = _placeHolder.AddComponent(); le.preferredWidth = _layoutElement.preferredWidth; le.preferredHeight = _layoutElement.preferredHeight; _placeHolder.transform.SetSiblingIndex(this.transform.GetSiblingIndex()); parentToReturnTo = this.transform.parent; placeHolderParent = parentToReturnTo; _layoutElement.ignoreLayout = true; this.transform.SetParent(this.transform.parent.parent); this.GetComponent().blocksRaycasts = false; } public void OnDrag(PointerEventData eventData) { if (_placeHolder.transform.parent != placeHolderParent) { _placeHolder.transform.SetParent(placeHolderParent); } RectTransformUtility.ScreenPointToWorldPointInRectangle(this.transform as RectTransform, eventData.position, eventData.pressEventCamera, out var position); this.transform.position = position; int newSiblingIndex = placeHolderParent.childCount; for (int i = 0; i < placeHolderParent.childCount; i++) { var child = placeHolderParent.GetChild(i); if (child.gameObject.activeSelf && position.x < child.position.x) { newSiblingIndex = i; if (_placeHolder.transform.GetSiblingIndex() < newSiblingIndex) newSiblingIndex--; break; } } _placeHolder.transform.SetSiblingIndex(newSiblingIndex); } public void OnEndDrag(PointerEventData eventData) { _layoutElement.ignoreLayout = false; this.transform.SetParent(parentToReturnTo); this.GetComponent().blocksRaycasts = true; this.transform.SetSiblingIndex(_placeHolder.transform.GetSiblingIndex()); Destroy(_placeHolder); onDragEnd.Invoke(); } }