wangguan
2020-11-17 2ff55a1d8446f27ebd22ce9dfbf15185f97a60c9
Assets/Scripts/Core/Input/InputController.cs
@@ -9,472 +9,473 @@
namespace Core.Input
{
   /// <summary>
   /// Class to manage tap/drag/pinch gestures and other controls
   /// </summary>
   public class InputController : Singleton<InputController>
   {
      /// <summary>
      /// How quickly flick velocity is accumulated with movements
      /// </summary>
      const float k_FlickAccumulationFactor = 0.8f;
    /// <summary>
    /// Class to manage tap/drag/pinch gestures and other controls
    /// </summary>
    public class InputController : Singleton<InputController>
    {
        /// <summary>
        /// How quickly flick velocity is accumulated with movements
        /// </summary>
        const float k_FlickAccumulationFactor = 0.8f;
      /// <summary>
      /// How far fingers must move before starting a drag
      /// </summary>
      public float dragThresholdTouch = 5;
        /// <summary>
        /// How far fingers must move before starting a drag
        /// </summary>
        public float dragThresholdTouch = 5;
      /// <summary>
      /// How far mouse must move before starting a drag
      /// </summary>
      public float dragThresholdMouse;
        /// <summary>
        /// How far mouse must move before starting a drag
        /// </summary>
        public float dragThresholdMouse;
      /// <summary>
      /// How long before a touch can no longer be considered a tap
      /// </summary>
      public float tapTime = 0.2f;
        /// <summary>
        /// How long before a touch can no longer be considered a tap
        /// </summary>
        public float tapTime = 0.2f;
      /// <summary>
      /// How long before a touch is considered a hold
      /// </summary>
      public float holdTime = 0.8f;
        /// <summary>
        /// How long before a touch is considered a hold
        /// </summary>
        public float holdTime = 0.8f;
      /// <summary>
      /// Sensitivity of mouse-wheel based zoom
      /// </summary>
      public float mouseWheelSensitivity = 1.0f;
        /// <summary>
        /// Sensitivity of mouse-wheel based zoom
        /// </summary>
        public float mouseWheelSensitivity = 1.0f;
      /// <summary>
      /// How many mouse buttons to track
      /// </summary>
      public int trackMouseButtons = 2;
        /// <summary>
        /// How many mouse buttons to track
        /// </summary>
        public int trackMouseButtons = 2;
      /// <summary>
      /// Flick movement threshold
      /// </summary>
      public float flickThreshold = 2f;
        /// <summary>
        /// Flick movement threshold
        /// </summary>
        public float flickThreshold = 2f;
      /// <summary>
      /// All the touches we're tracking
      /// </summary>
      List<TouchInfo> m_Touches;
        /// <summary>
        /// All the touches we're tracking
        /// </summary>
        List<TouchInfo> m_Touches;
      /// <summary>
      /// Mouse button info
      /// </summary>
      List<MouseButtonInfo> m_MouseInfo;
        /// <summary>
        /// Mouse button info
        /// </summary>
        List<MouseButtonInfo> m_MouseInfo;
      /// <summary>
      /// Gets the number of active touches
      /// </summary>
      public int activeTouchCount
      {
         get { return m_Touches.Count; }
      }
        /// <summary>
        /// Gets the number of active touches
        /// </summary>
        public int activeTouchCount
        {
            get { return m_Touches.Count; }
        }
      /// <summary>
      /// Tracks if any of the mouse buttons were pressed this frame
      /// </summary>
      public bool mouseButtonPressedThisFrame { get; private set; }
        /// <summary>
        /// Tracks if any of the mouse buttons were pressed this frame
        /// </summary>
        public bool mouseButtonPressedThisFrame { get; private set; }
      /// <summary>
      /// Tracks if the mouse moved this frame
      /// </summary>
      public bool mouseMovedOnThisFrame { get; private set; }
        /// <summary>
        /// Tracks if the mouse moved this frame
        /// </summary>
        public bool mouseMovedOnThisFrame { get; private set; }
      /// <summary>
      /// Tracks if a touch began this frame
      /// </summary>
      public bool touchPressedThisFrame { get; private set; }
        /// <summary>
        /// Tracks if a touch began this frame
        /// </summary>
        public bool touchPressedThisFrame { get; private set; }
      /// <summary>
      /// Current mouse pointer info
      /// </summary>
      public PointerInfo basicMouseInfo { get; private set; }
        /// <summary>
        /// Current mouse pointer info
        /// </summary>
        public PointerInfo basicMouseInfo { get; private set; }
      /// <summary>
      /// Event called when a pointer press is detected
      /// </summary>
      public event Action<PointerActionInfo> pressed;
        /// <summary>
        /// Event called when a pointer press is detected
        /// </summary>
        public event Action<PointerActionInfo> pressed;
      /// <summary>
      /// Event called when a pointer is released
      /// </summary>
      public event Action<PointerActionInfo> released;
        /// <summary>
        /// Event called when a pointer is released
        /// </summary>
        public event Action<PointerActionInfo> released;
      /// <summary>
      /// Event called when a pointer is tapped
      /// </summary>
      public event Action<PointerActionInfo> tapped;
        /// <summary>
        /// Event called when a pointer is tapped
        /// </summary>
        public event Action<PointerActionInfo> tapped;
      /// <summary>
      /// Event called when a drag starts
      /// </summary>
      public event Action<PointerActionInfo> startedDrag;
        /// <summary>
        /// Event called when a drag starts
        /// </summary>
        public event Action<PointerActionInfo> startedDrag;
      /// <summary>
      /// Event called when a pointer is dragged
      /// </summary>
      public event Action<PointerActionInfo> dragged;
        /// <summary>
        /// Event called when a pointer is dragged
        /// </summary>
        public event Action<PointerActionInfo> dragged;
      /// <summary>
      /// Event called when a pointer starts a hold
      /// </summary>
      public event Action<PointerActionInfo> startedHold;
        /// <summary>
        /// Event called when a pointer starts a hold
        /// </summary>
        public event Action<PointerActionInfo> startedHold;
      /// <summary>
      /// Event called when the user scrolls the mouse wheel
      /// </summary>
      public event Action<WheelInfo> spunWheel;
        /// <summary>
        /// Event called when the user scrolls the mouse wheel
        /// </summary>
        public event Action<WheelInfo> spunWheel;
      /// <summary>
      /// Event called when the user performs a pinch gesture
      /// </summary>
      public event Action<PinchInfo> pinched;
        /// <summary>
        /// Event called when the user performs a pinch gesture
        /// </summary>
        public event Action<PinchInfo> pinched;
      /// <summary>
      /// Event called whenever the mouse is moved
      /// </summary>
      public event Action<PointerInfo> mouseMoved;
        /// <summary>
        /// Event called whenever the mouse is moved
        /// </summary>
        public event Action<PointerInfo> mouseMoved;
      protected override void Awake()
      {
         base.Awake();
         m_Touches = new List<TouchInfo>();
        protected override void Awake()
        {
            base.Awake();
            m_Touches = new List<TouchInfo>();
         // Mouse specific initialization
         if (UnityInput.mousePresent)
         {
            m_MouseInfo = new List<MouseButtonInfo>();
            basicMouseInfo = new MouseCursorInfo {currentPosition = UnityInput.mousePosition};
            // Mouse specific initialization
            if (UnityInput.mousePresent)
            {
                m_MouseInfo = new List<MouseButtonInfo>();
                basicMouseInfo = new MouseCursorInfo { currentPosition = UnityInput.mousePosition };
            for (int i = 0; i < trackMouseButtons; ++i)
            {
               m_MouseInfo.Add(new MouseButtonInfo
               {
                  currentPosition = UnityInput.mousePosition,
                  mouseButtonId = i
               });
            }
         }
                for (int i = 0; i < trackMouseButtons; ++i)
                {
                    m_MouseInfo.Add(new MouseButtonInfo
                    {
                        currentPosition = UnityInput.mousePosition,
                        mouseButtonId = i
                    });
                }
            }
         UnityInput.simulateMouseWithTouches = false;
      }
            UnityInput.simulateMouseWithTouches = false;
        }
      /// <summary>
      /// Update all input
      /// </summary>
      void Update()
      {
         if (basicMouseInfo != null)
         {
            // Mouse was detected as present
            UpdateMouse();
         }
         // Handle touches
         UpdateTouches();
      }
        /// <summary>
        /// Update all input
        /// </summary>
        void Update()
        {
            if (basicMouseInfo != null)
            {
                // Mouse was detected as present
                UpdateMouse();
            }
            // Handle touches
            UpdateTouches();
        }
      /// <summary>
      /// Perform logic to update mouse/pointing device
      /// </summary>
      void UpdateMouse()
      {
         basicMouseInfo.previousPosition = basicMouseInfo.currentPosition;
         basicMouseInfo.currentPosition = UnityInput.mousePosition;
         basicMouseInfo.delta = basicMouseInfo.currentPosition - basicMouseInfo.previousPosition;
         mouseMovedOnThisFrame = basicMouseInfo.delta.sqrMagnitude >= Mathf.Epsilon;
         mouseButtonPressedThisFrame = false;
        /// <summary>
        /// Perform logic to update mouse/pointing device
        /// </summary>
        void UpdateMouse()
        {
            basicMouseInfo.previousPosition = basicMouseInfo.currentPosition;
            basicMouseInfo.currentPosition = UnityInput.mousePosition;
            basicMouseInfo.delta = basicMouseInfo.currentPosition - basicMouseInfo.previousPosition;
            mouseMovedOnThisFrame = basicMouseInfo.delta.sqrMagnitude >= Mathf.Epsilon;
            mouseButtonPressedThisFrame = false;
         // Move event
         if (basicMouseInfo.delta.sqrMagnitude > Mathf.Epsilon)
         {
            if (mouseMoved != null)
            {
               mouseMoved(basicMouseInfo);
            }
         }
         // Button events
         for (int i = 0; i < trackMouseButtons; ++i)
         {
            MouseButtonInfo mouseButton = m_MouseInfo[i];
            mouseButton.delta = basicMouseInfo.delta;
            mouseButton.previousPosition = basicMouseInfo.previousPosition;
            mouseButton.currentPosition = basicMouseInfo.currentPosition;
            if (UnityInput.GetMouseButton(i))
            {
               if (!mouseButton.isDown)
               {
                  // First press
                  mouseButtonPressedThisFrame = true;
                  mouseButton.isDown = true;
                  mouseButton.startPosition = UnityInput.mousePosition;
                  mouseButton.startTime = Time.realtimeSinceStartup;
                  mouseButton.startedOverUI = EventSystem.current.IsPointerOverGameObject(-mouseButton.mouseButtonId - 1);
            // Move event
            if (basicMouseInfo.delta.sqrMagnitude > Mathf.Epsilon)
            {
                if (mouseMoved != null)
                {
                    mouseMoved(basicMouseInfo);
                }
            }
            // Button events
            for (int i = 0; i < trackMouseButtons; ++i)
            {
                MouseButtonInfo mouseButton = m_MouseInfo[i];
                mouseButton.delta = basicMouseInfo.delta;
                mouseButton.previousPosition = basicMouseInfo.previousPosition;
                mouseButton.currentPosition = basicMouseInfo.currentPosition;
                if (UnityInput.GetMouseButton(i))
                {
                    if (!mouseButton.isDown)
                    {
                        // First press
                        mouseButtonPressedThisFrame = true;
                        mouseButton.isDown = true;
                        mouseButton.startPosition = UnityInput.mousePosition;
                        mouseButton.startTime = Time.realtimeSinceStartup;
                        mouseButton.startedOverUI = EventSystem.current.IsPointerOverGameObject(-mouseButton.mouseButtonId - 1);
                  // Reset some stuff
                  mouseButton.totalMovement = 0;
                  mouseButton.isDrag = false;
                  mouseButton.wasHold = false;
                  mouseButton.isHold = false;
                  mouseButton.flickVelocity = Vector2.zero;
                        // Reset some stuff
                        mouseButton.totalMovement = 0;
                        mouseButton.isDrag = false;
                        mouseButton.wasHold = false;
                        mouseButton.isHold = false;
                        mouseButton.flickVelocity = Vector2.zero;
                  if (pressed != null)
                  {
                     pressed(mouseButton);
                  }
               }
               else
               {
                  float moveDist = mouseButton.delta.magnitude;
                  // Dragging?
                  mouseButton.totalMovement += moveDist;
                  if (mouseButton.totalMovement > dragThresholdMouse)
                  {
                     bool wasDrag = mouseButton.isDrag;
                        if (pressed != null)
                        {
                            pressed(mouseButton);
                        }
                    }
                    else
                    {
                        float moveDist = mouseButton.delta.magnitude;
                        // Dragging?
                        mouseButton.totalMovement += moveDist;
                        if (mouseButton.totalMovement > dragThresholdMouse)
                        {
                            bool wasDrag = mouseButton.isDrag;
                     mouseButton.isDrag = true;
                     if (mouseButton.isHold)
                     {
                        mouseButton.wasHold = mouseButton.isHold;
                        mouseButton.isHold = false;
                     }
                            mouseButton.isDrag = true;
                            if (mouseButton.isHold)
                            {
                                mouseButton.wasHold = mouseButton.isHold;
                                mouseButton.isHold = false;
                            }
                     // Did it just start now?
                     if (!wasDrag)
                     {
                        if (startedDrag != null)
                        {
                           startedDrag(mouseButton);
                        }
                     }
                     if (dragged != null)
                     {
                        dragged(mouseButton);
                     }
                            // Did it just start now?
                            if (!wasDrag)
                            {
                                if (startedDrag != null)
                                {
                                    startedDrag(mouseButton);
                                }
                            }
                            if (dragged != null)
                            {
                                dragged(mouseButton);
                            }
                     // Flick?
                     if (moveDist > flickThreshold)
                     {
                        mouseButton.flickVelocity =
                           (mouseButton.flickVelocity * (1 - k_FlickAccumulationFactor)) +
                           (mouseButton.delta * k_FlickAccumulationFactor);
                     }
                     else
                     {
                        mouseButton.flickVelocity = Vector2.zero;
                     }
                  }
                  else
                  {
                     // Stationary?
                     if (!mouseButton.isHold &&
                         !mouseButton.isDrag &&
                         Time.realtimeSinceStartup - mouseButton.startTime >= holdTime)
                     {
                        mouseButton.isHold = true;
                        if (startedHold != null)
                        {
                           startedHold(mouseButton);
                        }
                     }
                  }
               }
            }
            else // Mouse button not up
            {
               if (mouseButton.isDown) // Released
               {
                  mouseButton.isDown = false;
                  // Quick enough (with no drift) to be a tap?
                  if (!mouseButton.isDrag &&
                      Time.realtimeSinceStartup - mouseButton.startTime < tapTime)
                  {
                     if (tapped != null)
                     {
                        tapped(mouseButton);
                     }
                  }
                  if (released != null)
                  {
                     released(mouseButton);
                  }
               }
            }
         }
                            // Flick?
                            if (moveDist > flickThreshold)
                            {
                                mouseButton.flickVelocity =
                                    (mouseButton.flickVelocity * (1 - k_FlickAccumulationFactor)) +
                                    (mouseButton.delta * k_FlickAccumulationFactor);
                            }
                            else
                            {
                                mouseButton.flickVelocity = Vector2.zero;
                            }
                        }
                        else
                        {
                            // Stationary?
                            if (!mouseButton.isHold &&
                                !mouseButton.isDrag &&
                                Time.realtimeSinceStartup - mouseButton.startTime >= holdTime)
                            {
                                mouseButton.isHold = true;
                                if (startedHold != null)
                                {
                                    startedHold(mouseButton);
                                }
                            }
                        }
                    }
                }
                else // Mouse button not up
                {
                    if (mouseButton.isDown) // Released
                    {
                        mouseButton.isDown = false;
                        // Quick enough (with no drift) to be a tap?
                        if (!mouseButton.isDrag &&
                            Time.realtimeSinceStartup - mouseButton.startTime < tapTime)
                        {
                            if (tapped != null)
                            {
                                tapped(mouseButton);
                            }
                        }
                        if (released != null)
                        {
                            released(mouseButton);
                        }
                    }
                }
            }
         // Mouse wheel
         if (Mathf.Abs(UnityInput.GetAxis("Mouse ScrollWheel")) > Mathf.Epsilon)
         {
            if (spunWheel != null)
            {
               spunWheel(new WheelInfo
               {
                  zoomAmount = UnityInput.GetAxis("Mouse ScrollWheel") * mouseWheelSensitivity
               });
            }
         }
      }
            // Mouse wheel
            if (Mathf.Abs(UnityInput.GetAxis("Mouse ScrollWheel")) > Mathf.Epsilon)
            {
                if (spunWheel != null)
                {
                    spunWheel(new WheelInfo
                    {
                        zoomAmount = UnityInput.GetAxis("Mouse ScrollWheel") * mouseWheelSensitivity
                    });
                }
            }
        }
      /// <summary>
      /// Update all touches
      /// </summary>
      void UpdateTouches()
      {
         touchPressedThisFrame = false;
         for (int i = 0; i < UnityInput.touchCount; ++i)
         {
            Touch touch = UnityInput.GetTouch(i);
        /// <summary>
        /// Update all touches
        /// </summary>
        void UpdateTouches()
        {
            touchPressedThisFrame = false;
            //for (int i = 0; i < UnityInput.touchCount; ++i)
            if (UnityInput.touchCount > 0)
            {
                Touch touch = UnityInput.GetTouch(0);
            // Find existing touch, or create new one
            TouchInfo existingTouch = m_Touches.FirstOrDefault(t => t.touchId == touch.fingerId);
                // Find existing touch, or create new one
                TouchInfo existingTouch = m_Touches.FirstOrDefault(t => t.touchId == touch.fingerId);
            if (existingTouch == null)
            {
               existingTouch = new TouchInfo
               {
                  touchId = touch.fingerId,
                  startPosition = touch.position,
                  currentPosition = touch.position,
                  previousPosition = touch.position,
                  startTime = Time.realtimeSinceStartup,
                  startedOverUI = EventSystem.current.IsPointerOverGameObject(touch.fingerId)
               };
                if (existingTouch == null)
                {
                    existingTouch = new TouchInfo
                    {
                        touchId = touch.fingerId,
                        startPosition = touch.position,
                        currentPosition = touch.position,
                        previousPosition = touch.position,
                        startTime = Time.realtimeSinceStartup,
                        startedOverUI = EventSystem.current.IsPointerOverGameObject(touch.fingerId)
                    };
               m_Touches.Add(existingTouch);
                    m_Touches.Add(existingTouch);
               // Sanity check
               Debug.Assert(touch.phase == TouchPhase.Began);
            }
            switch (touch.phase)
            {
               case TouchPhase.Began:
                  touchPressedThisFrame = true;
                  if (pressed != null)
                  {
                     pressed(existingTouch);
                  }
                  break;
                    // Sanity check
                    Debug.Assert(touch.phase == TouchPhase.Began);
                }
                switch (touch.phase)
                {
                    case TouchPhase.Began:
                        touchPressedThisFrame = true;
                        if (pressed != null)
                        {
                            pressed(existingTouch);
                        }
                        break;
               case TouchPhase.Moved:
                  bool wasDrag = existingTouch.isDrag;
                  UpdateMovingFinger(touch, existingTouch);
                    case TouchPhase.Moved:
                        bool wasDrag = existingTouch.isDrag;
                        UpdateMovingFinger(touch, existingTouch);
                  // Is this a drag?
                  existingTouch.isDrag = existingTouch.totalMovement >= dragThresholdTouch;
                        // Is this a drag?
                        existingTouch.isDrag = existingTouch.totalMovement >= dragThresholdTouch;
                  if (existingTouch.isDrag)
                  {
                     if (existingTouch.isHold)
                     {
                        existingTouch.wasHold = existingTouch.isHold;
                        existingTouch.isHold = false;
                     }
                     // Did it just start now?
                     if (!wasDrag)
                     {
                        if (startedDrag != null)
                        {
                           startedDrag(existingTouch);
                        }
                     }
                     if (dragged != null)
                     {
                        dragged(existingTouch);
                     }
                        if (existingTouch.isDrag)
                        {
                            if (existingTouch.isHold)
                            {
                                existingTouch.wasHold = existingTouch.isHold;
                                existingTouch.isHold = false;
                            }
                            // Did it just start now?
                            if (!wasDrag)
                            {
                                if (startedDrag != null)
                                {
                                    startedDrag(existingTouch);
                                }
                            }
                            if (dragged != null)
                            {
                                dragged(existingTouch);
                            }
                     if (existingTouch.delta.sqrMagnitude > flickThreshold * flickThreshold)
                     {
                        existingTouch.flickVelocity =
                           (existingTouch.flickVelocity * (1 - k_FlickAccumulationFactor)) +
                           (existingTouch.delta * k_FlickAccumulationFactor);
                     }
                     else
                     {
                        existingTouch.flickVelocity = Vector2.zero;
                     }
                  }
                  else
                  {
                     UpdateHoldingFinger(existingTouch);
                  }
                  break;
                            if (existingTouch.delta.sqrMagnitude > flickThreshold * flickThreshold)
                            {
                                existingTouch.flickVelocity =
                                    (existingTouch.flickVelocity * (1 - k_FlickAccumulationFactor)) +
                                    (existingTouch.delta * k_FlickAccumulationFactor);
                            }
                            else
                            {
                                existingTouch.flickVelocity = Vector2.zero;
                            }
                        }
                        else
                        {
                            UpdateHoldingFinger(existingTouch);
                        }
                        break;
               case TouchPhase.Canceled:
               case TouchPhase.Ended:
                  // Could have moved a bit
                  UpdateMovingFinger(touch, existingTouch);
                  // Quick enough (with no drift) to be a tap?
                  if (!existingTouch.isDrag &&
                      Time.realtimeSinceStartup - existingTouch.startTime < tapTime)
                  {
                     if (tapped != null)
                     {
                        tapped(existingTouch);
                     }
                  }
                  if (released != null)
                  {
                     released(existingTouch);
                  }
                    case TouchPhase.Canceled:
                    case TouchPhase.Ended:
                        // Could have moved a bit
                        UpdateMovingFinger(touch, existingTouch);
                        // Quick enough (with no drift) to be a tap?
                        if (!existingTouch.isDrag &&
                            Time.realtimeSinceStartup - existingTouch.startTime < tapTime)
                        {
                            if (tapped != null)
                            {
                                tapped(existingTouch);
                            }
                        }
                        if (released != null)
                        {
                            released(existingTouch);
                        }
                  // Remove from track list
                  m_Touches.Remove(existingTouch);
                  break;
                        // Remove from track list
                        m_Touches.Remove(existingTouch);
                        break;
               case TouchPhase.Stationary:
                  UpdateMovingFinger(touch, existingTouch);
                  UpdateHoldingFinger(existingTouch);
                  existingTouch.flickVelocity = Vector2.zero;
                  break;
            }
         }
                    case TouchPhase.Stationary:
                        UpdateMovingFinger(touch, existingTouch);
                        UpdateHoldingFinger(existingTouch);
                        existingTouch.flickVelocity = Vector2.zero;
                        break;
                }
            }
         if (activeTouchCount >= 2 && (m_Touches[0].isDrag ||
                                       m_Touches[1].isDrag))
         {
            if (pinched != null)
            {
               pinched(new PinchInfo
               {
                  touch1 = m_Touches[0],
                  touch2 = m_Touches[1]
               });
            }
         }
      }
            if (activeTouchCount >= 2 && (m_Touches[0].isDrag ||
                                          m_Touches[1].isDrag))
            {
                if (pinched != null)
                {
                    pinched(new PinchInfo
                    {
                        touch1 = m_Touches[0],
                        touch2 = m_Touches[1]
                    });
                }
            }
        }
      /// <summary>
      /// Update a TouchInfo that might be holding
      /// </summary>
      /// <param name="existingTouch"></param>
      void UpdateHoldingFinger(PointerActionInfo existingTouch)
      {
         if (!existingTouch.isHold &&
             !existingTouch.isDrag &&
             Time.realtimeSinceStartup - existingTouch.startTime >= holdTime)
         {
            existingTouch.isHold = true;
            if (startedHold != null)
            {
               startedHold(existingTouch);
            }
         }
      }
        /// <summary>
        /// Update a TouchInfo that might be holding
        /// </summary>
        /// <param name="existingTouch"></param>
        void UpdateHoldingFinger(PointerActionInfo existingTouch)
        {
            if (!existingTouch.isHold &&
                !existingTouch.isDrag &&
                Time.realtimeSinceStartup - existingTouch.startTime >= holdTime)
            {
                existingTouch.isHold = true;
                if (startedHold != null)
                {
                    startedHold(existingTouch);
                }
            }
        }
      /// <summary>
      /// Update a TouchInfo with movement
      /// </summary>
      /// <param name="touch">The Unity touch object</param>
      /// <param name="existingTouch">The object that's tracking Unity's touch</param>
      void UpdateMovingFinger(Touch touch, PointerActionInfo existingTouch)
      {
         float dragDist = touch.deltaPosition.magnitude;
        /// <summary>
        /// Update a TouchInfo with movement
        /// </summary>
        /// <param name="touch">The Unity touch object</param>
        /// <param name="existingTouch">The object that's tracking Unity's touch</param>
        void UpdateMovingFinger(Touch touch, PointerActionInfo existingTouch)
        {
            float dragDist = touch.deltaPosition.magnitude;
         existingTouch.previousPosition = existingTouch.currentPosition;
         existingTouch.currentPosition = touch.position;
         existingTouch.delta = touch.deltaPosition;
         existingTouch.totalMovement += dragDist;
      }
   }
            existingTouch.previousPosition = existingTouch.currentPosition;
            existingTouch.currentPosition = touch.position;
            existingTouch.delta = touch.deltaPosition;
            existingTouch.totalMovement += dragDist;
        }
    }
}