/// <summary>
        ///
        /// </summary>
        /// <param name="gameObject"></param>
        /// <param name="includeChildren"></param>
        /// <param name="callback"></param>
        public void RegisterTouchUp(GameObject gameObject, bool includeChildren, OnTouchDelegate callback)
        {
            if (gameObject == null)
            {
                RegisterTouchUp(callback);
                return;
            }

            Collider collider = gameObject.GetComponentInChildren <Collider>();

            if (collider == null)
            {
                DebugLogger.LogWarning("Touch : Could not register tap. No Collider found on {0}", gameObject.name);
                return;
            }

            LeanFingerUp   up         = collider.gameObject.AddComponent <LeanFingerUp>();
            LeanSelectable selectable = AddSelectableComponent(gameObject);

            selectable.DeselectOnUp = true;
            up.RequiredSelectable   = selectable;
            up.OnFinger.AddListener((LeanFinger leanFinger) =>
            {
                callback?.Invoke(new TouchCallbackVO
                {
                    gameObject = gameObject
                });
            });
        }
        public void Initialize()
        {
            registeredSwipeDeltaCallbacks = new Dictionary <GameObject, List <OnTouchDelegate> >();
            registeredTapCallbacks        = new Dictionary <LeanFingerTap, List <OnTouchDelegate> >();

            leanTouch      = gameObject.AddComponent <LeanTouch>();
            leanSelect     = gameObject.AddComponent <LeanSelect>();
            leanFingerTap  = gameObject.AddComponent <LeanFingerTap>();
            leanFingerDown = gameObject.AddComponent <LeanFingerDown>();
            leanFingerUp   = gameObject.AddComponent <LeanFingerUp>();

            leanFingerTap.OnFinger.AddListener(leanSelect.SelectScreenPosition);
            leanFingerDown.OnFinger.AddListener(leanSelect.SelectScreenPosition);

            leanSelect.LayerMask     &= ~(1 << LayerMask.NameToLayer("PostProcessing"));
            leanSelect.SelectUsing    = LeanSelect.SelectType.CanvasUI;
            leanSelect.SelectUsingAlt = LeanSelect.SelectType.Raycast3D;

            leanFingerDown.IgnoreStartedOverGui = false;
            leanFingerUp.IgnoreStartedOverGui   = false;
            leanFingerTap.IgnoreStartedOverGui  = false;
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="gameObject"></param>
        public void UnRegisterAll(GameObject gameObject)
        {
            LeanFingerTap     tap  = gameObject.GetComponent <LeanFingerTap>();
            LeanFingerDown    down = gameObject.GetComponent <LeanFingerDown>();
            LeanFingerUp      up   = gameObject.GetComponent <LeanFingerUp>();
            LeanDragTranslate drag = gameObject.GetComponent <LeanDragTranslate>();

            if (drag != null)
            {
                GameObject.Destroy(drag);
            }
            if (down != null)
            {
                down.OnFinger.RemoveAllListeners();
                down.OnPosition.RemoveAllListeners();
            }
            if (up != null)
            {
                up.OnFinger.RemoveAllListeners();
                up.OnPosition.RemoveAllListeners();
            }
            if (tap != null)
            {
                tap.OnFinger.RemoveAllListeners();
                tap.OnPosition.RemoveAllListeners();

                if (registeredTapCallbacks.ContainsKey(tap))
                {
                    registeredTapCallbacks.Remove(tap);
                }
            }

            if (registeredSwipeDeltaCallbacks.ContainsKey(gameObject))
            {
                registeredSwipeDeltaCallbacks.Remove(gameObject);
            }
        }