使用协程的统一滑动输入
本文关键字:输入 | 更新日期: 2023-09-27 18:08:55
我正在使用以下代码行来准确检测四个方向的滑动,但我不明白为什么它不工作请帮助
void Update ()
{
if (Input.GetKey(KeyCode.Joystick1Button9))
Application.Quit();
Dictionary<int, Touch> touch = new Dictionary<int, Touch>();
foreach (Touch t in Input.touches)
{
Vector2 Direction = new Vector2(0,0);
switch (t.phase)
{
case TouchPhase.Began:
touch[t.fingerId] = t;
Swiped = false;
break;
case TouchPhase.Ended:
if (touch.ContainsKey(t.fingerId))
{
Direction = t.position - touch[t.fingerId].position;
Direction = Direction.normalized;
Swiped = true;
}
else
Swiped = false;
break;
default :
Swiped = false;
break;
}
if (Swiped)
{
if (Vector2.Dot(Direction,Vector2.up) > Mathf.Sqrt(1/2f))
{
GameObject.FindObjectOfType<Light>().color = Color.red ;
RandomObjects();
}
else if (Vector2.Dot(Direction, -1*Vector2.up) > Mathf.Sqrt(1/2f))
{
GameObject.FindObjectOfType<Light>().color = Color.green;
RandomObjects();
}
else if (Vector2.Dot(Direction, Vector2.right) > Mathf.Sqrt(1/2f))
{
GameObject.FindObjectOfType<Light>().color = Color.blue;
RandomObjects();
}
else if (Vector2.Dot(Direction,-1 * Vector2.right) > Mathf.Sqrt(1/2f))
{
GameObject.FindObjectOfType<Light>().color = Color.yellow;
RandomObjects();
}
}
}
}
根据建议,我停止使用协程,并在Update()方法中编写代码。
你的代码中有很多问题:
- 代码不工作,因为您在
WaitForSeconds
之后没有再次调用Input.GetTouch()
。 - 这是不是一个准确的滑动检测。严格来说,这根本不是一个滑动检测。如果您双击并在第二次点击时按住手指,您的代码将将其检测为滑动。但事实并非如此。此外,持续时间少于0.5秒的手势将不会被检测到。为了进行准确的手势检测,你需要持续分析用户的输入。
应该是这样的:
const float swipeThreshold = 100.0f;
IEnumerator SwipeInput(Action<Vector2> onSwipe)
{
Dictionary<int, Touch> activeTouches = new Dictionary<int, Touch>();
Dictionary<int, Vector3> activeButtons = new Dictionary<int, Vector3>();
while (true)
{
if (Input.touches.Length > 0)
foreach (Touch touch in Input.touches)
switch (touch.phase)
{
case TouchPhase.Began:
activeTouches[touch.fingerId] = touch;
break;
case TouchPhase.Ended:
if (activeTouches.ContainsKey(touch.fingerId))
{
Vector2 delta = touch.position - activeTouches[touch.fingerId].position;
if (delta.magnitude > swipeThreshold)
onSwipe(delta);
}
break;
}
else
for (int i = 0; i <= 2; ++i)
{
if (Input.GetMouseButtonDown(i))
activeButtons[i] = Input.mousePosition;
else if (Input.GetMouseButtonUp(i) && activeButtons.ContainsKey(i))
{
Vector2 delta = Input.mousePosition - activeButtons[i];
if (delta.magnitude > swipeThreshold)
onSwipe(delta);
}
}
yield return new WaitForFixedUpdate();
}
}
注:协程看起来很酷。但不要把它用在你能想到的所有事情上。否则你最终会努力去同步它们。只有在你真正需要的时候才使用它们。也就是说,当使用它们时,会产生更清晰、紧凑或优雅的代码。例如,手势检测就不是这种情况。