Ошибка C # IndexOutOfRangeException - PullRequest
       13

Ошибка C # IndexOutOfRangeException

0 голосов
/ 15 февраля 2012

С небольшой проблемой c # здесь. В настоящее время я пишу небольшую платформерную игру с Unity, и у меня было несколько радиопередач, которые проверяли столкновения и тому подобное.

Теперь я начал немного чистить код, сохраняя результаты этих raycasts в массиве целых чисел, но получаю исключение IndexOutOfRangeException.

Я пытался прочитать мой код много раз, но, похоже, не могу найти причину проблемы. Если кто-то может мне помочь, я был бы очень рад.

Вот мой код:

using UnityEngine;
using System.Collections;

public class PlayerRayCaster : MonoBehaviour {

    public float playerHeight = 1;
    public enum FeetState {Air, Ground};

    public FeetState playerFeetState = FeetState.Air;
    public int feetHitRays;
    public int behindHitRay;

    //Arrays of rays. value of 1 means that ray hits a target, 0 means that it does not hit.
    public int[] sideRays; // [0-3] = Left side. [4-8] = Right side.
    public int[] depthRays; // [0] = Away from camera. [1] = Towards camera.
    public int[] feetRays;

    public int counter;

    void Start(){
        sideRays = new int[8];
        depthRays = new int[2];
        feetRays = new int[3];

    }
    // Update is called once per frame
    void Update () {
        FeetRays();
        SideRays();
        BehindRay();
    }

    //Rays, which check if the character is bumping into an object, left or right.
    void SideRays(){

        float rayLength = 0.4f;
        counter = 0;

        //Left side rays.
        for(int rayHeight = 0 ; rayHeight>=-4 ; rayHeight-=1 , counter++){
            Debug.Log(sideRays[counter]);
            if(Physics.Raycast(transform.position-new Vector3(0,rayHeight/2,0), new Vector3(-1,0,0),rayLength)){
                sideRays[counter] = 1;
                Debug.DrawRay(transform.position-new Vector3(0,rayHeight/2,0), new Vector3(-rayLength,0,0), Color.green);
            }
            else{
                sideRays[counter] = 0;
                Debug.DrawRay(transform.position-new Vector3(0,rayHeight/2,0), new Vector3(-rayLength,0,0), Color.yellow);
            }
        }

        //Right side rays.
        for(int rayHeight = 0;rayHeight>=-4;rayHeight-=1,counter++){
            if(Physics.Raycast(transform.position-new Vector3(0,rayHeight/2,0), new Vector3(1,0,0),rayLength)){
                sideRays[counter] = 1;
                Debug.DrawRay(transform.position-new Vector3(0,rayHeight/2,0), new Vector3(rayLength,0,0), Color.green);
            }
            else{
                sideRays[counter] = 0;
                Debug.DrawRay(transform.position-new Vector3(0,rayHeight/2,0), new Vector3(rayLength,0,0), Color.yellow);
            }
        }
    }

    //Three rays, which check if the characters feet are on the ground or not.
    void FeetRays(){
        feetHitRays = 0;
        float rayLength = 0.2f;
        //Shoots three rays down from player.
        for(float i=-0.7f;i<=0.7f;i+=0.7f){

            if(Physics.Raycast(transform.position-new Vector3(i/2,0,0), new Vector3(0,-1,0),rayLength)){
                feetHitRays++;
                Debug.DrawRay(transform.position-new Vector3(i/2,0,0), new Vector3(0,-rayLength,0), Color.green);
            }
            else{
                Debug.DrawRay(transform.position-new Vector3(i/2,0,0), new Vector3(0,-rayLength,0), Color.red);
            }
        }

        //Sets the feet state.
        if(feetHitRays==0)
        {
            playerFeetState = PlayerRayCaster.FeetState.Air;
        }
        else{
            playerFeetState = PlayerRayCaster.FeetState.Ground;
        }       
    }
    //Shoots a raycast in z-direction from the character, to check for door access.
    void BehindRay(){

        behindHitRay = 0;
        float rayLength = 2;

        if(Physics.Raycast(transform.position, new Vector3(0,0,1), rayLength)){ //Away from camera
            behindHitRay = 1;
            Debug.DrawRay(transform.position, new Vector3(0,0,rayLength), Color.green);
        }
        if(Physics.Raycast(transform.position, new Vector3(0,0,-1), rayLength)){ // Towards camera.
            behindHitRay = -1;
            Debug.DrawRay(transform.position, new Vector3(0,0,-rayLength), Color.green);
        }
    }
}

Это строка, которая дает мне исключение:

sideRays[counter] = 1;

Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 15 февраля 2012

Я считаю, что это проблема:

for(int rayHeight = 0 ; rayHeight>=-4 ; rayHeight-=1 , counter++)

Вы в основном делаете это дважды, и это означает 10 итераций, тогда как ваш массив инициализируется так:

sideRays = new int[8];

Вы вполне можете хотеть:

// Note the > instead of >=
for (int rayHeight = 0; rayHeight > -4; rayHeight--, counter++)

(Кроме того, я бы очень настоятельно рекомендовал не использовать публичные поля, но это другой вопрос.)

1 голос
/ 15 февраля 2012

Проверьте свои границы на for(int rayHeight = 0;rayHeight>=-4;rayHeight-=1,counter++){ В итоге вы получите доступ к массиву 5 раз для каждого цикла, и вы определили, что ваш массив состоит из 8 элементов.Доступ к 9 и 10 вызовет исключение.

1 голос
/ 15 февраля 2012

Вы объявляете sideRays размером 8, но при быстром взгляде на ваши циклы счетчик может достигать 10 *.

...