Вращение игрового объекта с использованием касания в Unity 3d с C # - PullRequest
0 голосов
/ 07 сентября 2018

Я вращаю GameObject на основе касания двумя пальцами. У меня отлично работает вращение, но я получаю странную проблему, когда иногда я касаюсь двумя пальцами, чтобы начать вращение, но как только я касаюсь экрана, объект мгновенно поворачивается. Это кажется случайным относительно того, когда это делает, и вращение также кажется случайным. Я думаю, что касание вызывает поворот на основе последней позиции, но мой код должен сбрасывать начальную позицию.

Сенсорный код находится в сценарии, прикрепленном к объекту для поворота, поэтому он находится в одном файле.

Вот код.

В методе обновления я обнаруживаю, что он поддерживается касанием, и пытаюсь вызвать "HandleTouch ()"

void Update()
{
    if (Input.touchSupported)
        HandleTouch();
    else
        HandleMouse();
}

Метод HandleTouch

private void HandleTouch()
{
    if (Input.touchCount < 2) return;
    switch (Input.touchCount)
    {
        case 2:
            Touch touch = Input.GetTouch(0);
            if (touch.phase == TouchPhase.Began)
            {
                lastRotPosition = touch.position;
            }
            else if (touch.phase == TouchPhase.Moved)
            {
                Vector3 offset = touch.position - lastRotPosition;
                lastRotPosition = touch.position;
                RotateCamera(offset.x * RotateSpeedTouch, offset.y * RotateSpeedTouch);
            }
            else if (touch.phase == TouchPhase.Ended)
            {
                lastRotPosition = new Vector2();
            }
            break;
    }
}

И это метод, который вращает GameObject

void RotateCamera(float x, float y)
{
    float rotX = x * rotateSpeed * Mathf.Deg2Rad;
    float rotY = y * rotateSpeed * Mathf.Deg2Rad;
    transform.Rotate(Vector3.up, rotX);
    transform.Rotate(Vector3.right, -rotY);
}

Спасибо за любую помощь или понимание, которое вы можете предложить.

1 Ответ

0 голосов
/ 07 сентября 2018

Вы не отслеживаете fingerId

При касаниях нельзя хранить в том же порядке:

Кроме того, устройство может обнаруживать непрерывность касания между обновлениями кадров, поэтому согласованный идентификационный номер может передаваться по кадрам и использоваться для определения того, как движется конкретный палец.

... свойство fingerId можно использовать для определения одинакового прикосновения между кадрами.

Поэтому, когда новый палец касается экрана, ваш код может увидеть это:

  • касания первого пальца, количество касаний 1, код пропуска
  • второй палец касается, это второй палец в массиве, счетчик касаний 2, начинаем обработку:
    • первое касание имеет фазу TouchPhase.Moved
    • lastRotPosition в настоящее время равен нулю (из-за значения по умолчанию или из-за предыдущего TouchPhase.Ended)
    • touch.position - lastRotPosition оценивается как ненулевое (происходит большое вращение)

Когда все работает правильно, вы получаете это:

  • касания первого пальца, количество касаний 1, код пропуска
  • второй палец касается, это первый палец в массиве, число касаний 2, начинайте обработку:
    • первое касание имеет фазу TouchPhase.Begin
    • lastRotPosition обновляется до местоположения касания
    • следующий кадр touch.position - lastRotPosition оценивается почти как ноль (происходит небольшое вращение)
...