2017-10-10 97 views
1

这是错误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("fuck"); 
     // 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(); 
    } 
} 

回答

1

你应该检查myTouchs至少有一个元素。实际上,即使myTouchs为空,也可以输入else分支,这会引发异常。

+0

非常感谢Andrea,你可以修复代码帮助我,我已经修复它但不要;((( – Richey

0

如果myTouchs.Length < 1这意味着myTouchs包含0个元素。

所以,如果你Input.GetTouch(0)将返回NULL,则存在GetTouch数组中没有触摸avaliable

在你的其他添加此条件

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

,或者改变您的初始到

if (myTouchs.Length >= 1) 

改变别人看起来应该像

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)