Сенсорный ввод и обнаружение движения с мобильного устройства

#unity3d

#unity3d

Вопрос:

Я написал следующую программу для обнаружения сенсорного ввода с помощью мыши, а также для ввода с помощью свайпа на мобильном устройстве.

Мобильная часть отлично работает с симулятором устройств Unity. Однако часть мыши выдает следующую ошибку:

Исключение IndexOutOfRangeException: индекс находился за пределами массива.

Что я здесь упускаю из виду?

 using UnityEngine;

public class SwipeDetection : MonoBehaviour
{
    public Player _Player;

    private Vector2 _startPos;

    private bool _fingerDown;

    public int _PixelDistToDetect = 50;


    private void Start()
    {
        _startPos = transform.position;
    }


    private void Update()
    {
        #region MOBILE TOUCH

        if (!_fingerDown amp;amp; Input.touchCount > 0 amp;amp; Input.touches[0].phase == TouchPhase.Began)
        {
            _fingerDown = true;
            _startPos = Input.touches[0].position;
        }

        if (_fingerDown)
        {
            if (Input.touches[0].position.y >= _startPos.y   _PixelDistToDetect)                // up
            {
                _fingerDown = false;                                                            Debug.Log( string.Format("<color=red><b><size=15> UP </size></b></color>") );
            }
            else if (Input.touches[0].position.x <= _startPos.x - _PixelDistToDetect)           // left
            {
                _fingerDown = false;                                                            Debug.Log( string.Format("<color=red><b><size=15> LEFT </size></b></color>") );
            }
            else if (Input.touches[0].position.x >= _startPos.x   _PixelDistToDetect)           // right
            {
                _fingerDown = false;                                                            Debug.Log( string.Format("<color=red><b><size=15> RIGHT </size></b></color>") );
            }
            else if (Input.touches[0].position.y <= _startPos.y - _PixelDistToDetect)           // down
            {
                _fingerDown = false;                                                            Debug.Log( string.Format("<color=red><b><size=15> DOWN </size></b></color>") );
            }
        }

        if (_fingerDown amp;amp; Input.touchCount > 0 amp;amp; Input.touches[0].phase == TouchPhase.Ended)
        {
            _fingerDown = false;
        }

        #endregion MOBILE TOUCH
        
        #region MOUSE DRAG

        if (!_fingerDown amp;amp; Input.GetMouseButtonDown(0))
        {
            _fingerDown = true;
            _startPos = Input.mousePosition;
        }

        if (_fingerDown)
        {
            if (Input.mousePosition.y >= _startPos.y   _PixelDistToDetect)                      // up
            {
                _fingerDown = false;                                                            Debug.Log( string.Format("<color=red><b><size=15> UP </size></b></color>") );
            }
            else if (Input.mousePosition.x <= _startPos.x - _PixelDistToDetect)                 // left
            {
                _fingerDown = false;                                                            Debug.Log( string.Format("<color=red><b><size=15> LEFT </size></b></color>") );
            }
            else if (Input.mousePosition.x >= _startPos.x   _PixelDistToDetect)                 // right
            {
                _fingerDown = false;                                                            Debug.Log( string.Format("<color=red><b><size=15> RIGHT </size></b></color>") );
            }
            else if (Input.mousePosition.y <= _startPos.y - _PixelDistToDetect)                 // down
            {
                _fingerDown = false;                                                            Debug.Log( string.Format("<color=red><b><size=15> DOWN </size></b></color>") );
            }
        }

        if (_fingerDown amp;amp; Input.GetMouseButtonUp(0))
        {
            _fingerDown = false;
        }

        #endregion MOUSE DRAG
    }
}
 

Ответ №1:

поскольку вы кодируете (в разделе перетаскивания для мобильных устройств), установите для _fingerDown значение true, поэтому следующий вызов обновления кадра

  if (_fingerDown) ...
 

на мобильном устройстве коснитесь раздела
и введите.нажмите always null (находясь на ПК), и вы вызовете ввод.касания [0]
таким образом, индексируются IndexOutOfBound

Комментарии:

1. Вот оно что! Спасибо. Я добавил #if UNITY_EDITOR #else #endif , чтобы убедиться, что выполняется только правильный код.

2. или используйте Application.platform, если не хотите использовать URL-адрес оператора #if: docs.unity3d.com/ScriptReference/Application-platform.html