【问题标题】:Index out of bounds error. How do i fix it? [duplicate]索引超出范围错误。我如何解决它? [复制]
【发布时间】:2017-10-10 10:11:11
【问题描述】:

这是错误deltaVector = (Vector3)Input.GetTouch(0).position - transform.position; 完整代码在这里:

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class JoystickController : 
MonoBehaviour, IPointerUpHandler, IPointerDownHandler {

        public ControllerInput tankPlayer;
        public float offset = 35.0f;

        public Sprite button_not_touch;
        public Sprite button_touch;

        public Image[] imageButtons;

        private bool isTouch;
        private Vector3 deltaVector;

  void Update()
  {
    // When touch, process touch postion
    if (isTouch) {

      // Check touch, if have mutiple touch
      Touch[] myTouchs = Input.touches;
      Vector3 touchPos = Vector3.zero;

      if (myTouchs.Length > 1) {
        for (int i = 0; i < myTouchs.Length; i++)
        {
          if (myTouchs[i].position.y < transform.position.y * 2 && myTouchs[i].position.x < transform.position.x * 2) {
            touchPos = myTouchs[i].position;
            break;
          }
        }
        deltaVector = touchPos - transform.position;
      }
      else
        deltaVector = (Vector3)Input.GetTouch(0).position - transform.position;
      Debug.Log("log");
      // Process when magnitude delta vector greater than 25
      if (Vector3.Magnitude(deltaVector) > 25.0f) {
        if (Mathf.Abs(deltaVector.x) > Mathf.Abs(deltaVector.y)) {
          // Move horizontal
          if (deltaVector.x > offset) {
            tankPlayer.MoveRight();
            ButtonHit(3);
          } else if (deltaVector.x < -offset) {
            tankPlayer.MoveLeft();
            ButtonHit(1);
          }
        } else {
          // Move vertical
          if (deltaVector.y > offset) {
            tankPlayer.MoveUp();
            ButtonHit(0);
          } else if (deltaVector.y < -offset) {
            tankPlayer.MoveDown();
            ButtonHit(2);
          }
        }
      } else
      tankPlayer.Release();
    } else
      tankPlayer.Release();
  }

  // Method to change button sprites
  void ButtonHit(int indexTouch)
  {
    foreach(Image image in imageButtons)
    image.sprite = button_not_touch;


    imageButtons[indexTouch].sprite = button_touch;
  }

        // Event handle when touch to joystick
        public void OnPointerUp(PointerEventData eventData )
  {

    foreach(Image image in imageButtons)
    image.sprite = button_not_touch;

    isTouch = false;
  }

        // Event handle when touch to joystick
        public void OnPointerDown(PointerEventData eventData)
  {
    isTouch = true;
  }

  void OnDisable()
  {
    tankPlayer.Release();
  }
}

【问题讨论】:

    标签: c# unity3d touch


    【解决方案1】:

    您应该检查myTouchs 是否至少有一个元素。其实myTouchs为空也可以进入else分支,这会引发异常。

    【讨论】:

    • 非常感谢安德里亚,你可以帮我修复代码,我已经修复了它但没有;(((
    【解决方案2】:

    如果 myTouchs.Length

    因此,如果您执行 Input.GetTouch(0),如果 GetTouch 数组中没有可用的 Touch,它将返回 null

    在你的 else 中添加这个条件

    else if( myTouchs.Length == 1) 
    //your code
    

    或者改变你的初始如果是

     if (myTouchs.Length >= 1)
    

    改变 else 应该是这样的

     if (myTouchs.Length > 1) {
        for (int i = 0; i < myTouchs.Length; i++)
        {
          if (myTouchs[i].position.y < transform.position.y * 2 && myTouchs[i].position.x < transform.position.x * 2) {
            touchPos = myTouchs[i].position;
            break;
          }
        }
        deltaVector = touchPos - transform.position;
      }
      else if( myTouchs.Length == 1) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 2014-09-08
      • 2015-04-27
      • 1970-01-01
      相关资源
      最近更新 更多