Разве устройство и Android не могут точно следовать за пальцем? - PullRequest
0 голосов
/ 01 октября 2018

Я создаю игру для Android с Unity и пытаюсь создать объект, который будет следовать за моим пальцем.Это код, который я использую.

for (int i = 0; i < Input.touchCount; i++)
    {
        RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.touches[i].position), Vector2.zero);

        Vector3 touchPosition = Camera.main.ScreenToWorldPoint(Input.touches[i].position);

        if (Input.GetTouch(i).phase == TouchPhase.Moved && hit.collider != null)
        {
            transform.position = new Vector2(touchPosition.x, touchPosition.y + sizeY);
        }
    }

Я поместил коллайдер ниже объекта и добавил размер объекта к Y, так что он появляется над моим пальцем.Проблема в том, что, если я немного двигаю пальцем, я теряю объект, который остается позади.Поскольку объект отстает, если я двигаю палец быстрее, я оказываюсь вне зоны коллайдера, и объект просто перестает двигаться.Единственный способ, который я нашел, это работает, это избавиться от вещи Raycast и заставить объект следовать за касанием в любом месте экрана (мне это не нравится).

Я просто хочу знать, является ли этолучшее, что я могу получить от Unity и Android, или если есть способ заставить объект следовать за пальцем одним за другим, с точностью, без задержки.Я тестирую на Samsung Galaxy S8 только с объектом и ничем иным.

1 Ответ

0 голосов
/ 01 октября 2018

Вы не одиноки с этим вопросом.API ввода Unity основан на частоте кадров и может не соответствовать скорости сенсорного движения на экране.Если вы работаете над чем-то, что требует быстрого реагирования на основе касания на экране, используйте новую InputSystem новой Unity.Этот API все еще находится в экспериментальном режиме.

Его класс Touchscreen может использоваться для доступа к касанию на экране.Ваш текущий код должен выглядеть примерно так:

public int touchIndex = 0;

void Update()
{
    Touchscreen touchscreen = UnityEngine.Experimental.Input.Touchscreen.current;

    if (touchscreen.allTouchControls[touchIndex].ReadValue().phase != PointerPhase.None &&
               touchscreen.allTouchControls[touchIndex].ReadValue().phase == PointerPhase.Moved)
    {
        Vector2 touchLocation = touchscreen.allTouchControls[touchIndex].ReadValue().position;   
        RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(touchLocation), Vector2.zero);    
        Vector3 touchPosition = Camera.main.ScreenToWorldPoint(touchLocation);
        transform.position = new Vector2(touchPosition.x, touchPosition.y + sizeY);   
    }
}
...