#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