首页 > 解决方案 > 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;”

错误在哪里,有什么建议吗?最诚挚的问候!

标签: c#unity3d

解决方案


Input.touches 返回表示最后一帧期间所有触摸状态的对象列表。每个条目代表手指触摸屏幕的状态。

由于它是一个数组,当不包含任何值时尝试访问其中的元素会抛出一个IndexOutOfRangeException 有关这些的更多信息,请参阅这篇很棒的帖子。

考虑使用迭代器访问此数组,例如循环或 foreach 语句,因此您不要尝试访问它不存在的成员。

还要考虑验证this.m_Id' 的值是否小于或等于Input.touches[] 的最后一个有效索引。


推荐阅读