Как постоянно получать позицию касания? - PullRequest
0 голосов
/ 05 января 2019

У меня есть код, который предсказывает траекторию стрельбы из стрелки в LateUpdate(). Он отлично работает на ПК и с мышью. Ниже приведен код для использования мыши:

    if(Input.GetMouseButton(0)){
        //get the rotation based on the start drag position compared to the current drag position
        zRotation = (Input.mousePosition.y - mouseStart) * (manager.data.sensitivity/15);
        zRotation = Mathf.Clamp(zRotation, -manager.data.maxAimRotation, manager.data.maxAimRotation);
    }
    //reset the rotation if the player is not aiming
    else if((int) zRotation != 0){
        if(zRotation > 0){
            zRotation --;
        }
        else{
            zRotation ++;
        }
    }

Я хочу перенести это на Android сейчас, поэтому играюсь с Input.Touch. Я изменил вышеуказанный код на следующее:

 if (Input.touchCount > 0)
            {
                //get the rotation based on the start drag position compared to the current drag position
                zRotation = (Input.GetTouch(0).deltaPosition.y) * (manager.data.sensitivity / 15);
                zRotation = Mathf.Clamp(zRotation, -manager.data.maxAimRotation, manager.data.maxAimRotation);
            }
            //reset the rotation if the player is not aiming
            else if ((int)zRotation != 0)
            {
                if (zRotation > 0)
                {
                    zRotation--;
                }
                else
                {
                    zRotation++;
                }
            }

Но zRotation не работает, как это работает в мыши. Он продолжает сбрасываться в начальную позицию после каждого кадра. Это почти похоже на дрожание.

Что я делаю не так?

1 Ответ

0 голосов
/ 05 января 2019

Я вижу, что для мобильных элементов управления вы используете Input.GetTouch(0).deltaPosition.y. Однако deltaPosition дает вам разницу между позицией в последнем обновлении по сравнению с текущей. Допустим, ваше приложение работает на скорости 60 кадров в секунду, оно будет возвращать расстояние в 1/60 секунды. Конечно, это будет число, близкое к нулю, и я считаю, что именно поэтому оно всегда возвращает начальную позицию

https://docs.unity3d.com/ScriptReference/Touch-deltaPosition.html

Вам придется сделать это аналогично тому, как вы делали это с помощью мышиного подхода. Установите переменную touchStart для Touchphase.Began и сравните ее с touch.position.

float touchStart = 0;

if (Input.touchCount > 0)
            {
                if (Input.GetTouch(0).phase == TouchPhase.Began) touchStart = Input.GetTouch(0).position.y;
                //get the rotation based on the start drag position compared to the current drag position
                zRotation = (Input.GetTouch(0).position.y - touchStart) * (manager.data.sensitivity / 15);
                zRotation = Mathf.Clamp(zRotation, -manager.data.maxAimRotation, manager.data.maxAimRotation);
            }
            //reset the rotation if the player is not aiming
            else if ((int)zRotation != 0)
            {
                if (zRotation > 0)
                {
                    zRotation--;
                }
                else
                {
                    zRotation++;
                }
            }

Хотя я не проверял это, так что поправьте меня, если я ошибаюсь!

...