Я создаю игру для Android с Unity. Есть только три способа управления движением персонажа:
- Нажмите в правой половине экрана: перейти вправо
- Нажмите в левой половине экрана: перейти влево
- Проведите пальцем вверх: персонаж бросается вперед
Теоретически я знаю, что могу различать прикосновения с помощью TouchPhases (началось, переместилось, остановилось и закончилось). Когда я только обнаруживал касания, не заботясь о пролистываниях, я просто проверял, началась ли фаза касания, и заставлял игрока прыгать. Это чувствовалось быстро на моем устройстве.
Однако, поскольку я должен учитывать, что может произойти удар, я не могу инициировать действие прыжка, пока не обнаружу ThouchPhase.Ended. Это приводит к очень медленному реагирующему персонажу, который не прыгает, пока пользователь не поднимает палец на экране.
Я попытался использовать ThouchPhase.Moved и ThouchPhase.Stationary вместо этого, чтобы имитировать немедленный ответ, но мое решение довольно плохо с точки зрения определения разницы между касанием и пролистыванием:
Vector2 startTouchPosition;
Vector2 endTouchPosition;
Vector2 currentSwipe;
void Update()
{
if (Input.touches.Length > 0)
{
for (int i = 0; i < Input.touchCount; i++)
{
Touch touch = Input.GetTouch(i);
if (touch.phase == TouchPhase.Began)
{
//save began touch 2d point
startTouchPosition = new Vector2(touch.position.x, touch.position.y);
}
if (touch.phase == TouchPhase.Moved || touch.phase == TouchPhase.Stationary)
{
//save ended touch 2d point
endTouchPosition = new Vector2(touch.position.x, touch.position.y);
if (endTouchPosition.y - startTouchPosition.y < 5)
{
if (touch.position.x > (Screen.width / 2))
{
JumpToRight();
}
else if (touch.position.x < (Screen.width / 2))
{
JumpToLeft();
}
}
else
{
//create vector from the two points
currentSwipe = new Vector2(endTouchPosition.x - startTouchPosition.x, endTouchPosition.y - startTouchPosition.y);
//normalize the 2d vector
currentSwipe.Normalize();
//swipe upwards
if (currentSwipe.y > 0 && currentSwipe.x > -0.5f && currentSwipe.x < 0.5f)
{
DashForward();
}
}
}
}
}
}