c# - Unity 错误:索引超出了数组的范围
问题描述
您好,我今天下载了一个 Unity Pack 并想对其进行测试,但它不起作用。如果我运行我会收到此错误 IndexOutOfRangeException: Index was outside the bounds of the array。
using System;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using UnityStandardAssets.CrossPlatformInput;
namespace FlightKit
{
public class AirplaneTouchControl : MonoBehaviour, IPointerDownHandler, IEventSystemHandler, IPointerUpHandler
{
private void OnEnable()
{
this.CreateVirtualAxes();
}
private void CreateVirtualAxes()
{
this.m_UseX = (this.axesToUse == AirplaneTouchControl.AxisOption.Both || this.axesToUse == AirplaneTouchControl.AxisOption.OnlyHorizontal);
this.m_UseY = (this.axesToUse == AirplaneTouchControl.AxisOption.Both || this.axesToUse == AirplaneTouchControl.AxisOption.OnlyVertical);
if (this.m_UseX)
{
this.m_HorizontalVirtualAxis = new CrossPlatformInputManager.VirtualAxis(this.horizontalAxisName);
CrossPlatformInputManager.RegisterVirtualAxis(this.m_HorizontalVirtualAxis);
}
if (this.m_UseY)
{
this.m_VerticalVirtualAxis = new CrossPlatformInputManager.VirtualAxis(this.verticalAxisName);
CrossPlatformInputManager.RegisterVirtualAxis(this.m_VerticalVirtualAxis);
}
}
private void UpdateVirtualAxes(Vector3 value)
{
if (this.m_UseX)
{
this.m_HorizontalVirtualAxis.Update(value.x);
}
if (this.m_UseY)
{
this.m_VerticalVirtualAxis.Update(value.y);
}
}
private void Update()
{
if (!this.m_Dragging)
{
return;
}
if (this.m_Dragging)
{
Vector3 a = Input.touches[this.m_Id].position;
Vector3 vector = a - this.m_Center;
float d = Mathf.Min(vector.magnitude / (this.maxHandleDistance + 0.01f), 1f);
vector.Normalize();
vector *= d;
vector.x *= this.Xsensitivity;
vector.y *= -1f * this.Ysensitivity;
this.UpdateVirtualAxes(vector);
Vector3 localPosition = a - this.m_Center;
if (localPosition.magnitude > this.maxHandleDistance)
{
localPosition = localPosition.normalized * this.maxHandleDistance;
}
this.handleImage.transform.localPosition = localPosition;
}
}
public void OnPointerDown(PointerEventData data)
{
this.m_Dragging = true;
this.m_Id = data.pointerId;
if (this.baseImage != null)
{
this.baseImage.enabled = true;
this.baseImage.transform.position = data.position;
this.handleImage.enabled = true;
this.handleImage.transform.position = this.baseImage.transform.position;
}
this.m_Center = data.position;
}
public void OnPointerUp(PointerEventData data)
{
this.m_Dragging = false;
this.m_Id = -1;
this.UpdateVirtualAxes(Vector3.zero);
if (this.baseImage != null)
{
this.baseImage.enabled = false;
this.handleImage.enabled = false;
}
}
private void OnDisable()
{
if (CrossPlatformInputManager.AxisExists(this.horizontalAxisName))
{
CrossPlatformInputManager.UnRegisterVirtualAxis(this.horizontalAxisName);
}
if (CrossPlatformInputManager.AxisExists(this.verticalAxisName))
{
CrossPlatformInputManager.UnRegisterVirtualAxis(this.verticalAxisName);
}
}
public AirplaneTouchControl.AxisOption axesToUse;
public string horizontalAxisName = "Horizontal";
public string verticalAxisName = "Vertical";
public float Xsensitivity = 1f;
public float Ysensitivity = 1f;
[Header("Virtual joystick base to indicate steering center.")]
public Image baseImage;
[Header("Virtual joystick handle to indicate steering direction.")]
public Image handleImage;
[Header("How far can the handle move from the center of the base image.")]
public float maxHandleDistance = 100f;
private Vector3 m_StartPos;
private Vector2 m_PreviousDelta;
private Vector3 m_JoytickOutput;
private bool m_UseX;
private bool m_UseY;
private CrossPlatformInputManager.VirtualAxis m_HorizontalVirtualAxis;
private CrossPlatformInputManager.VirtualAxis m_VerticalVirtualAxis;
private bool m_Dragging;
private int m_Id = -1;
private Vector3 m_Center;
public enum AxisOption
{
Both,
OnlyHorizontal,
OnlyVertical
}
}
}
错误发生在第 53 行,标记为“Vector3 a = Input.touches[this.m_Id].position;”
错误在哪里,有什么建议吗?最诚挚的问候!
解决方案
Input.touches
返回表示最后一帧期间所有触摸状态的对象列表。每个条目代表手指触摸屏幕的状态。
由于它是一个数组,当不包含任何值时尝试访问其中的元素会抛出一个IndexOutOfRangeException
有关这些的更多信息,请参阅这篇很棒的帖子。
考虑使用迭代器访问此数组,例如循环或 foreach 语句,因此您不要尝试访问它不存在的成员。
还要考虑验证this.m_Id
' 的值是否小于或等于Input.touches
[] 的最后一个有效索引。
推荐阅读
- java - 无法从 Java Process builder 和 Linux 运行 'python -c ".." ' 命令
- count - 计算目录并排除目录
- python - 在 Python 中用帧制作视频
- javascript - how to mock multipart request using polly.js
- spring - 使用 Mockito 测试可能引发异常的 POST 服务的正确方法?
- python - 创建 3D 绘图(不是表面,散点图),其中颜色取决于 z 值
- reactjs - .js 文件重命名为 .tsx 文件后的打字稿混淆错误
- python - 为什么将 GNN 与 dgl 异形图一起使用会遇到行数据不匹配错误?
- java - okhttp 客户端在 # 符号处截断 http URL
- django - 编辑多选字段?