Как выбрать несколько кнопок с помощью прокрутки - PullRequest
1 голос
/ 24 октября 2019

Я делаю игру, похожую на Wordscapes, я пытаюсь найти способ выбрать буквы, проводя пальцем. Я новичок в мобильном вводе, поэтому я не уверен, что делать дальше. Вот мой входной скрипт, который я нашел в интернете и немного изменил по своему вкусу. Он работает, как и ожидалось, но обнаруживает только одно движение пальцем. Как запустить событие onclick, когда пользователь проводит пальцем по кнопке? Если возможно, я бы хотел отправить эту информацию делегату OnSwipe (поскольку я использую ее из других сценариев для обработки событий свайпов)

Я подумал, что лучевая передача с камеры будет лучшим вариантом. Может быть, кто-то может помочь мне изменить этот код, так как я не совсем понимаю, как все это сделать. Спасибо!

enter image description here

// Class used for detecting touch input (Swipe Exclusive)
public class TouchInput: MonoBehaviour {

    public static event Action<SwipeData> OnSwipe = delegate { };

    private Vector2 startPosition;
    private Vector2 endPosition;

    private float moveDistanceY = 0f;
    private float moveDistanceX = 0f;

    private SwipeDirection sDirection = new SwipeDirection();

    /// <summary>
    /// Update is called once per frame
    /// </summary>
    private void Update() {

        foreach (Touch touch in Input.touches) {

            if (touch.phase == TouchPhase.Began) {

                endPosition = touch.position;
                startPosition = touch.position;


            } else if (touch.phase == TouchPhase.Ended) {

                startPosition = touch.position;
                DetectSwipe();
            }
        }
    }

    /// <summary>
    /// Handles the detection of swipes
    /// </summary>
    private void DetectSwipe() {

        moveDistanceY = Mathf.Abs(startPosition.y - endPosition.y);
        moveDistanceX = Mathf.Abs(startPosition.x - endPosition.x);

        if (moveDistanceX > 20f || moveDistanceY > 20f) {

            if (moveDistanceY > moveDistanceX) {

                sDirection = startPosition.y - endPosition.y > 0 ? SwipeDirection.Up : SwipeDirection.Down;
                SendSwipe(sDirection);

            } else {

                sDirection = startPosition.x - endPosition.x > 0 ? SwipeDirection.Right : SwipeDirection.Left;
                SendSwipe(sDirection);
            }

            endPosition = startPosition;
        }
    }

    /// <summary>
    /// Sends data about the swipe to the "OnSwipe" Delegate
    /// </summary>
    private void SendSwipe(SwipeDirection dir) {

        SwipeData swipeData = new SwipeData() {

            Direction = dir,
            StartPosition = startPosition,
            EndPosition = endPosition
        };

        OnSwipe(swipeData);
    }

1 Ответ

0 голосов
/ 28 октября 2019

Используйте EventSystem и соответствующие обратные вызовы. Это современный способ ввода данных для настольных и мобильных устройств в Unity3D. Вы будете использовать обработчик перетаскивания. Отслеживайте элементы пользовательского интерфейса, которые вы перетаскивали, добавляя только один, если он отличается от предыдущего каждого кадра.

В этом видео есть хорошее руководство , которое все еще применяется к современной EventSystem.

...