Отслеживание первого тача

Программирование на Юнити.

Отслеживание первого тача

Сообщение Dellex 04 мар 2021, 19:37

Доброго времени суток, всем.

У меня есть скрипт который отвечает за передвижение камеры .
Скрипт рассчитывается применяться на мобильной платформе. Все работает плавно и хорошо. Но когда ставишь два пальца на экран. Камера сразу же прыгает ко второму пальцу. Как присваивать координаты только первому пальцу? Пробовал ограничивать касания пальцев через Input.touchCount но проблема возвращалась когда я отпускал первый палец. Камера сразу же переключалась на координаты второго пальца. :(( :(( :((

Синтаксис:
Используется csharp
    private Vector3 touchPoint;
    private Vector3 direction;


    [SerializeField] private float speed;
    [SerializeField] private Rigidbody rigidbody;


    void Update()
   {

        if (Input.touchCount > 0)
        {
            Touch touch = Input.touches[0];

           
            switch (touch.phase)
            {
                case TouchPhase.Began:

                    touchPoint = Camera.main.ScreenToWorldPoint(Input.touches[0].position);

                    break;

                case TouchPhase.Moved:

                    direction = touchPoint - Camera.main.ScreenToWorldPoint(Input.touches[0].position);
                    Camera.main.transform.position += direction;
                    rigidbody.AddForce(direction * speed, ForceMode.Impulse);

                    break;

                case TouchPhase.Ended:

                    rigidbody.AddForce(direction * speed, ForceMode.Impulse);

                    break;
            }
        }

    }
 
Последний раз редактировалось Dellex 09 мар 2021, 09:03, всего редактировалось 1 раз.
Аватара пользователя
Dellex
UNец
 
Сообщения: 4
Зарегистрирован: 04 мар 2021, 18:13

Re: Отслеживание первого тача

Сообщение 1max1 04 мар 2021, 21:05

Запоминай и проверяй https://docs.unity3d.com/ScriptReferenc ... gerId.html
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Отслеживание первого тача

Сообщение Dellex 10 мар 2021, 11:35

Решил сам :-t Для тех кто в будущем столкнется с возможной проблемой. Скину свой вариант решения, возможно он не самый идеальный, но на данном этапе я решил проблему таким образом.

Синтаксис:
Используется csharp

    private void TouchControl()
    {
        if (Application.isMobilePlatform)
        {

            if (Input.touchCount > 0)
            {
                Touch touch = Input.touches[0];

                switch (touch.phase)
                {
                    case TouchPhase.Began:

                        touchPoint = Camera.main.ScreenToWorldPoint(Input.touches[0].position);

                        break;

                    case TouchPhase.Moved:

                        direction = touchPoint - Camera.main.ScreenToWorldPoint(Input.touches[0].position);
                        Camera.main.transform.position += direction;
                        rigidbody.AddForce(direction * speed, ForceMode.Impulse);

                        break;

                    case TouchPhase.Ended:

                        if (Input.touchCount == 2)
                        {
                            touchPoint = Camera.main.ScreenToWorldPoint(Input.touches[1].position);
                        }

                        break;
                }
            }
        }
    }

 
Аватара пользователя
Dellex
UNец
 
Сообщения: 4
Зарегистрирован: 04 мар 2021, 18:13

Re: Отслеживание первого тача

Сообщение 1max1 10 мар 2021, 12:40

Как только игрок поставит 3 пальца будет тоже самое.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Отслеживание первого тача

Сообщение Dellex 10 мар 2021, 14:44

1max1 писал(а):Как только игрок поставит 3 пальца будет тоже самое.


Понимаю. Но я нигде не могу найти реализацию fingerId. Как вообще интовой переменной можно присвоить позицию. У меня маленький опыт в программировании, вообще понятия не имею как реализовать эту фитчу. [curved_hands]
Аватара пользователя
Dellex
UNец
 
Сообщения: 4
Зарегистрирован: 04 мар 2021, 18:13

Re: Отслеживание первого тача

Сообщение 1max1 10 мар 2021, 15:46

Как вообще интовой переменной можно присвоить позицию.

Зачем? Представь ситуацию, ты ставишь палец на экран, у этого тача, к примеру, id == 123, индекс в массиве 0, потом ты ставишь второй палец, его id == 555, индекс в массиве становиться 0, а предыдущий тач смещается на индекс 1. Из-за этого твой код работает неправильно. Ты должен запомнить id первого тача и давать работать коду только для него ибо он был самый первый.
Синтаксис:
Используется csharp
private int? id = null;

// update()
if (id == null && touchCount > 0)
    id = getTouch(0).fingerId;

if (id != null) {
    foreach var t in touches {
        if (t.fingerId == id.Value)
            // что-то делаем...
        if (t.phase == end or cancel)
            id = null;
    }
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 30