using System; using System.Collections; using System.Collections.Generic; using UnityEngine; [AddComponentMenu("NGUI/Interaction/Drag and Drop Item")] public class UIDragDropItem : MonoBehaviour { public enum Restriction { None, Horizontal, Vertical, PressAndHold } public Restriction restriction; public bool cloneOnDrag; [HideInInspector] public float pressAndHoldDelay = 1f; public bool interactable = true; public bool IsGridRepositionUse = true; [NonSerialized] protected Transform mTrans; [NonSerialized] protected Transform mParent; [NonSerialized] protected Collider mCollider; [NonSerialized] protected Collider2D mCollider2D; [NonSerialized] protected UIButton mButton; [NonSerialized] protected UIRoot mRoot; [NonSerialized] protected UIGrid mGrid; [NonSerialized] protected UITable mTable; [NonSerialized] protected float mDragStartTime; [NonSerialized] protected UIDragScrollView mDragScrollView; [NonSerialized] protected bool mPressed; [NonSerialized] protected bool mDragging; [NonSerialized] protected UICamera.MouseOrTouch mTouch; public static List draggedItems = new List(); protected virtual void Awake() { mTrans = base.transform; mCollider = base.gameObject.GetComponent(); mCollider2D = base.gameObject.GetComponent(); } protected virtual void OnEnable() { } protected virtual void OnDisable() { if (mDragging) { StopDragging(UICamera.hoveredObject); } } protected virtual void Start() { mButton = GetComponent(); mDragScrollView = GetComponent(); } protected virtual void OnPress(bool isPressed) { if (!interactable || UICamera.currentTouchID == -2 || UICamera.currentTouchID == -3) { return; } if (isPressed) { if (!mPressed) { mTouch = UICamera.currentTouch; mDragStartTime = RealTime.time + pressAndHoldDelay; mPressed = true; } } else if (mPressed && mTouch == UICamera.currentTouch) { mPressed = false; mTouch = null; } } protected virtual void Update() { if (restriction == Restriction.PressAndHold && mPressed && !mDragging && mDragStartTime < RealTime.time) { StartDragging(); } } protected virtual void OnDragStart() { if (!interactable || !base.enabled || mTouch != UICamera.currentTouch) { return; } if (restriction != Restriction.None) { if (restriction == Restriction.Horizontal) { Vector2 totalDelta = mTouch.totalDelta; if (Mathf.Abs(totalDelta.x) < Mathf.Abs(totalDelta.y)) { return; } } else if (restriction == Restriction.Vertical) { Vector2 totalDelta2 = mTouch.totalDelta; if (Mathf.Abs(totalDelta2.x) > Mathf.Abs(totalDelta2.y)) { return; } } else if (restriction == Restriction.PressAndHold) { return; } } StartDragging(); } public virtual void StartDragging() { if (!interactable || mDragging) { return; } if (cloneOnDrag) { mPressed = false; GameObject gameObject = NGUITools.AddChild(base.transform.parent.gameObject, base.gameObject); gameObject.transform.localPosition = base.transform.localPosition; gameObject.transform.localRotation = base.transform.localRotation; gameObject.transform.localScale = base.transform.localScale; UIButtonColor component = gameObject.GetComponent(); if (component != null) { component.defaultColor = GetComponent().defaultColor; } if (mTouch != null && mTouch.pressed == base.gameObject) { mTouch.current = gameObject; mTouch.pressed = gameObject; mTouch.dragged = gameObject; mTouch.last = gameObject; } UIDragDropItem component2 = gameObject.GetComponent(); component2.mTouch = mTouch; component2.mPressed = true; component2.mDragging = true; component2.Start(); component2.OnClone(base.gameObject); component2.OnDragDropStart(); if (UICamera.currentTouch == null) { UICamera.currentTouch = mTouch; } mTouch = null; UICamera.Notify(base.gameObject, "OnPress", false); UICamera.Notify(base.gameObject, "OnHover", false); } else { mDragging = true; OnDragDropStart(); } } protected virtual void OnClone(GameObject original) { } protected virtual void OnDrag(Vector2 delta) { if (interactable && mDragging && base.enabled && mTouch == UICamera.currentTouch) { OnDragDropMove(delta * mRoot.pixelSizeAdjustment); } } protected virtual void OnDragEnd() { if (interactable && base.enabled && mTouch == UICamera.currentTouch) { StopDragging(UICamera.hoveredObject); } } public void StopDragging(GameObject go) { if (mDragging) { mDragging = false; OnDragDropRelease(go); } } protected virtual void OnDragDropStart() { if (!draggedItems.Contains(this)) { draggedItems.Add(this); } if (mDragScrollView != null) { mDragScrollView.enabled = false; } if (mButton != null) { mButton.isEnabled = false; } else if (mCollider != null) { mCollider.enabled = false; } else if (mCollider2D != null) { mCollider2D.enabled = false; } mParent = mTrans.parent; mRoot = NGUITools.FindInParents(mParent); mGrid = NGUITools.FindInParents(mParent); mTable = NGUITools.FindInParents(mParent); if (UIDragDropRoot.root != null) { mTrans.parent = UIDragDropRoot.root; } Vector3 localPosition = mTrans.localPosition; localPosition.z = 0f; mTrans.localPosition = localPosition; TweenPosition component = GetComponent(); if (component != null) { component.enabled = false; } SpringPosition component2 = GetComponent(); if (component2 != null) { component2.enabled = false; } NGUITools.MarkParentAsChanged(base.gameObject); if (mTable != null) { mTable.repositionNow = true; } if (mGrid != null) { mGrid.repositionNow = true; } } protected virtual void OnDragDropMove(Vector2 delta) { mTrans.localPosition += (Vector3)delta; } protected virtual void OnDragDropRelease(GameObject surface) { if (!cloneOnDrag) { if (mButton != null) { mButton.isEnabled = true; } else if (mCollider != null) { mCollider.enabled = true; } else if (mCollider2D != null) { mCollider2D.enabled = true; } UIDragDropContainer uIDragDropContainer = (surface ? NGUITools.FindInParents(surface) : null); if (uIDragDropContainer != null) { mTrans.parent = ((uIDragDropContainer.reparentTarget != null) ? uIDragDropContainer.reparentTarget : uIDragDropContainer.transform); Vector3 localPosition = mTrans.localPosition; localPosition.z = 0f; mTrans.localPosition = localPosition; } else { mTrans.parent = mParent; } mParent = mTrans.parent; mGrid = NGUITools.FindInParents(mParent); mTable = NGUITools.FindInParents(mParent); if (mDragScrollView != null) { StartCoroutine(EnableDragScrollView()); } NGUITools.MarkParentAsChanged(base.gameObject); if (mTable != null) { mTable.repositionNow = true; } if (!IsGridRepositionUse) { mGrid = null; } if (mGrid != null) { mGrid.repositionNow = true; } } else { NGUITools.Destroy(base.gameObject); } OnDragDropEnd(); } protected virtual void OnDragDropEnd() { draggedItems.Remove(this); } protected IEnumerator EnableDragScrollView() { yield return new WaitForEndOfFrame(); if (mDragScrollView != null) { mDragScrollView.enabled = true; } } }