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

            GameObject target = gameObject;

            if (gameObject.transform is RectTransform)
            {
            }
            else
            {
                Collider collider = gameObject.GetComponentInChildren <Collider>();

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

            LeanFingerDown down = target.AddComponent <LeanFingerDown>();

            down.IgnoreStartedOverGui = false;

            LeanSelectable selectable = AddSelectableComponent(gameObject);

            selectable.DeselectOnUp = true;
            down.RequiredSelectable = selectable;
            down.OnFinger.AddListener((LeanFinger leanFinger) =>
            {
                Vector3 pos = leanFinger.ScreenPosition;
                callback?.Invoke(new TouchCallbackVO
                {
                    gameObject     = gameObject,
                    screenPosition = leanFinger.ScreenPosition
                });
            });
        }
        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);
            }
        }