void UpdateFingers() { touches.Clear(); // update all fingers foreach (Finger finger in fingers) { Vector2 pos = Vector2.zero; FingerPhase phase = GetPhase(finger); if (phase != FingerPhase.None) { pos = GetPosition(finger); } finger.Update(phase, pos); if (finger.IsDown) { touches.Add(finger); } } // post-update foreach (Finger finger in fingers) { finger.PostUpdate(); } }
internal void Update(bool newDownState, Vector2 newPos) { // stop ignoring this touch when the finger is no longer touching the screen if (filteredOut && !newDownState) { filteredOut = false; } // Apply global touch filter on new touches if (!IsDown && newDownState && !FingerGestures.instance.ShouldProcessTouch(index, newPos)) { filteredOut = true; newDownState = false; } // process touch prevPhase = phase; if (newDownState) { // new touch? reset finger state if (!WasDown) { phase = FingerPhase.Begin; pos = newPos; startPos = pos; prevPos = pos; deltaPos = Vector2.zero; moved = false; lastMoveTime = 0; startTime = Time.time; elapsedTimeStationary = 0; } else { prevPos = pos; pos = newPos; distFromStart = Vector3.Distance(startPos, pos); deltaPos = pos - prevPos; if (deltaPos.sqrMagnitude > 0) { lastMoveTime = Time.time; phase = FingerPhase.Moving; } else if (!IsMoving || ((Time.time - lastMoveTime) > 0.05f)) // allow for a small time buffer after we stopped moving { phase = FingerPhase.Stationary; } if (IsMoving) { // finger moved at least once moved = true; } else { if (!WasStationary) // begin a new stationary phase { elapsedTimeStationary = 0; } else { elapsedTimeStationary += Time.deltaTime; } } } } else { phase = FingerPhase.None; } }
internal void Update(FingerPhase newPhase, Vector2 newPos) { // validate phase transitions if (phase != newPhase) { // In low framerate situations, it is possible to miss some input updates and thus // skip the "Ended" phase if (newPhase == FingerPhase.None && phase != FingerPhase.Ended) { Debug.LogWarning("Correcting bad FingerPhase transition (FingerPhase.Ended skipped)"); Update(FingerPhase.Ended, PreviousPosition); return; } // cannot get a Moved or Stationary phase without being down first if (!down && (newPhase == FingerPhase.Moved || newPhase == FingerPhase.Stationary)) { Debug.LogWarning("Correcting bad FingerPhase transition (FingerPhase.Began skipped)"); Update(FingerPhase.Began, newPos); return; } if ((down && newPhase == FingerPhase.Began) || (!down && newPhase == FingerPhase.Ended)) { Debug.LogWarning("Invalid state FingerPhase transition from " + phase + " to " + newPhase + " - Skipping."); return; } } else // same phase as before { if (newPhase == FingerPhase.Began || newPhase == FingerPhase.Ended) { Debug.LogWarning("Duplicated FingerPhase." + newPhase.ToString() + " - skipping."); return; } } if (newPhase != FingerPhase.None) { if (newPhase == FingerPhase.Ended) { // release down = false; } else { if (newPhase == FingerPhase.Began) { // activate down = true; startPos = newPos; prevPos = newPos; startTime = Time.time; } prevPos = pos; pos = newPos; deltaPos = pos - prevPos; } } phase = newPhase; }
internal void Update(bool newDownState, UnityEngine.Vector2 newPos) { if (filteredOut && !newDownState) { filteredOut = false; } // 过滤 if (!IsDown && newDownState && !TouchManager.instance.ShouldProcessTouch(index, newPos)) { filteredOut = true; newDownState = false; } // 处理触摸 prevPhase = phase; if (newDownState) { // 新的触摸,重置手指状态 if (!WasDown) { phase = FingerPhase.Begin; pos = newPos; startPos = pos; prevPos = pos; deltaPos = UnityEngine.Vector2.zero; moved = false; lastMoveTime = 0; startTime = UnityEngine.Time.time; elapsedTimeStationary = 0; distFromStart = 0; } else { prevPos = pos; pos = newPos; distFromStart = UnityEngine.Vector3.Distance(startPos, pos); deltaPos = pos - prevPos; if (deltaPos.sqrMagnitude > 0) { lastMoveTime = UnityEngine.Time.time; phase = FingerPhase.Moving; } else if (!IsMoving || ((UnityEngine.Time.time - lastMoveTime) > 0.05f)) { // 停止移动之后有一点缓冲时间 phase = FingerPhase.Stationary; } if (IsMoving) { // 手指至少移动一次 moved = true; } else { if (!WasStationary) { // 开始以后新的静止状态 elapsedTimeStationary = 0; } else { elapsedTimeStationary += UnityEngine.Time.deltaTime; } } } } else { phase = FingerPhase.None; } }