using System; using System.Collections; using UnityEngine; [AddComponentMenu("NGUI/Interaction/Drag and Drop Item")] public class UIDragDropItem : MonoBehaviour { protected virtual void Start() { this.mTrans = base.transform; this.mCollider = base.gameObject.GetComponent(); this.mCollider2D = base.gameObject.GetComponent(); this.mButton = base.GetComponent(); this.mDragScrollView = base.GetComponent(); } protected void OnPress(bool isPressed) { if (isPressed) { this.mDragStartTime = RealTime.time + this.pressAndHoldDelay; this.mPressed = true; } else if (this.mPressed) { this.StopDragging(UICamera.hoveredObject); this.mPressed = false; } } protected virtual void Update() { if (this.restriction == UIDragDropItem.Restriction.PressAndHold && this.mPressed && !this.mDragging && this.mDragStartTime < RealTime.time) { this.StartDragging(); } } protected void OnDragStart() { if (!base.enabled || this.mTouchID != -2147483648) { return; } if (this.restriction != UIDragDropItem.Restriction.None) { if (this.restriction == UIDragDropItem.Restriction.Horizontal) { Vector2 totalDelta = UICamera.currentTouch.totalDelta; if (Mathf.Abs(totalDelta.x) < Mathf.Abs(totalDelta.y)) { return; } } else if (this.restriction == UIDragDropItem.Restriction.Vertical) { Vector2 totalDelta2 = UICamera.currentTouch.totalDelta; if (Mathf.Abs(totalDelta2.x) > Mathf.Abs(totalDelta2.y)) { return; } } else if (this.restriction == UIDragDropItem.Restriction.PressAndHold) { return; } } this.StartDragging(); } protected virtual void StartDragging() { if (!this.mDragging) { if (this.cloneOnDrag) { 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 = base.GetComponent().defaultColor; } UICamera.currentTouch.dragged = gameObject; UIDragDropItem component2 = gameObject.GetComponent(); component2.mDragging = true; component2.Start(); component2.OnDragDropStart(); } else { this.mDragging = true; this.OnDragDropStart(); } } } protected void OnDrag(Vector2 delta) { if (!this.mDragging || !base.enabled || this.mTouchID != UICamera.currentTouchID) { return; } this.OnDragDropMove(delta * this.mRoot.pixelSizeAdjustment); } protected void OnDragEnd() { if (!base.enabled || this.mTouchID != UICamera.currentTouchID) { return; } this.StopDragging(UICamera.hoveredObject); } public void StopDragging(GameObject go) { if (this.mDragging) { this.mDragging = false; this.OnDragDropRelease(go); } } protected virtual void OnDragDropStart() { if (this.mDragScrollView != null) { this.mDragScrollView.enabled = false; } if (this.mButton != null) { this.mButton.isEnabled = false; } else if (this.mCollider != null) { this.mCollider.enabled = false; } else if (this.mCollider2D != null) { this.mCollider2D.enabled = false; } this.mTouchID = UICamera.currentTouchID; this.mParent = this.mTrans.parent; this.mRoot = NGUITools.FindInParents(this.mParent); this.mGrid = NGUITools.FindInParents(this.mParent); this.mTable = NGUITools.FindInParents(this.mParent); if (UIDragDropRoot.root != null) { this.mTrans.parent = UIDragDropRoot.root; } Vector3 localPosition = this.TaregetTrans.localPosition; localPosition.z = 0f; this.TaregetTrans.localPosition = localPosition; TweenPosition component = base.GetComponent(); if (component != null) { component.enabled = false; } SpringPosition component2 = base.GetComponent(); if (component2 != null) { component2.enabled = false; } NGUITools.MarkParentAsChanged(base.gameObject); if (this.mTable != null) { this.mTable.repositionNow = true; } if (this.mGrid != null) { this.mGrid.repositionNow = true; } } protected virtual void OnDragDropMove(Vector2 delta) { this.TaregetTrans.localPosition += delta; } protected virtual void OnDragDropRelease(GameObject surface) { if (!this.cloneOnDrag) { this.mTouchID = int.MinValue; if (this.mButton != null) { this.mButton.isEnabled = true; } else if (this.mCollider != null) { this.mCollider.enabled = true; } else if (this.mCollider2D != null) { this.mCollider2D.enabled = true; } UIDragDropContainer uidragDropContainer = (!surface) ? null : NGUITools.FindInParents(surface); if (uidragDropContainer != null) { this.mTrans.parent = ((!(uidragDropContainer.reparentTarget != null)) ? uidragDropContainer.transform : uidragDropContainer.reparentTarget); Vector3 localPosition = this.TaregetTrans.localPosition; localPosition.z = 0f; this.TaregetTrans.localPosition = localPosition; } else { this.mTrans.parent = this.mParent; } this.mParent = this.mTrans.parent; this.mGrid = NGUITools.FindInParents(this.mParent); this.mTable = NGUITools.FindInParents(this.mParent); if (this.mDragScrollView != null) { base.StartCoroutine(this.EnableDragScrollView()); } NGUITools.MarkParentAsChanged(base.gameObject); if (this.mTable != null) { this.mTable.repositionNow = true; } if (this.mGrid != null) { this.mGrid.repositionNow = true; } this.OnDragDropEnd(); } else { NGUITools.Destroy(base.gameObject); } } protected virtual void OnDragDropEnd() { } protected IEnumerator EnableDragScrollView() { yield return new WaitForEndOfFrame(); if (this.mDragScrollView != null) { this.mDragScrollView.enabled = true; } yield break; } protected virtual Transform TaregetTrans { get { return this.mTrans; } } public UIDragDropItem.Restriction restriction; public bool cloneOnDrag; [HideInInspector] public float pressAndHoldDelay = 1f; protected Transform mTrans; protected Transform mParent; protected Collider mCollider; protected Collider2D mCollider2D; protected UIButton mButton; protected UIRoot mRoot; protected UIGrid mGrid; protected UITable mTable; protected int mTouchID = int.MinValue; protected float mDragStartTime; protected UIDragScrollView mDragScrollView; protected bool mPressed; protected bool mDragging; public enum Restriction { None, Horizontal, Vertical, PressAndHold } }