5 using System.Collections.Generic;
18 const float kContactEpsilon = 2.0f/60.0f;
21 [Tooltip(
"Time in seconds to determine if the contact registers as a tap or a hold")]
22 protected float MaxTapContactTime = 0.5f;
24 private List<PersistentTouch> ActiveTouches =
new List<PersistentTouch>(0);
26 private class PersistentTouch
28 public Touch touchData;
29 public Ray screenpointRay;
30 public float lifetime;
31 public PersistentTouch(Touch touch, Ray ray)
34 this.screenpointRay = ray;
44 if (!Input.touchSupported)
52 foreach (Touch touch
in Input.touches)
59 case TouchPhase.Began:
60 case TouchPhase.Moved:
61 case TouchPhase.Stationary:
62 UpdateTouch(touch, ray);
65 case TouchPhase.Ended:
66 case TouchPhase.Canceled:
73 #endregion // Unity methods 75 #region Event generation logic 79 PersistentTouch knownTouch = GetPersistentTouch(touch.fingerId);
80 if (knownTouch != null)
82 knownTouch.lifetime += Time.deltaTime;
88 ActiveTouches.Add(
new PersistentTouch(touch, ray));
89 OnHoldStartedEvent(touch.fingerId);
96 PersistentTouch knownTouch = GetPersistentTouch(touch.fingerId);
97 if (knownTouch != null)
99 if (touch.phase == TouchPhase.Ended)
101 if (knownTouch.lifetime < kContactEpsilon)
103 OnHoldCanceledEvent(touch.fingerId);
105 else if (knownTouch.lifetime < MaxTapContactTime)
107 OnHoldCanceledEvent(touch.fingerId);
108 OnTappedEvent(touch.fingerId, touch.tapCount);
112 OnHoldCompletedEvent(touch.fingerId);
117 OnHoldCanceledEvent(touch.fingerId);
119 ActiveTouches.Remove(knownTouch);
123 #endregion // Event generation logic 125 private PersistentTouch GetPersistentTouch(
int id)
127 for (
int i = 0; i < ActiveTouches.Count; ++i)
129 if (ActiveTouches[i].touchData.fingerId ==
id)
131 return ActiveTouches[i];
137 private Touch? GetTouch(
int id)
139 PersistentTouch knownTouch = GetPersistentTouch(
id);
140 if (knownTouch != null)
142 return knownTouch.touchData;
171 #region Base Input Source Methods 181 Touch? knownTouch = GetTouch((
int)sourceId);
182 position = (knownTouch.HasValue) ? (Vector3)knownTouch.Value.position : Vector3.zero;
183 return knownTouch.HasValue;
188 rotation = Quaternion.identity;
194 PersistentTouch knownTouch = GetPersistentTouch((
int)sourceId);
195 if (knownTouch != null)
197 pointingRay = knownTouch.screenpointRay;
200 pointingRay =
default(Ray);
206 position = Vector3.zero;
212 rotation = Quaternion.identity;
221 public override bool TryGetThumbstick(uint sourceId, out
bool isPressed, out Vector2 position)
224 position = Vector2.zero;
228 public override bool TryGetTouchpad(uint sourceId, out
bool isPressed, out
bool isTouched, out Vector2 position)
232 position = Vector2.zero;
236 public override bool TryGetSelect(uint sourceId, out
bool isPressed, out
double pressedAmount)
243 public override bool TryGetGrasp(uint sourceId, out
bool isPressed)
249 public override bool TryGetMenu(uint sourceId, out
bool isPressed)
255 #endregion // Base Input Source Methods