0

我正在Argument Out of Range Exception为我在 Unity 教程中关注的这个脚本获取一个。

这是一个例外:

ArgumentOutOfRangeException: Argument is out of range.
Parameter name: index
System.Collections.Generic.List`1[UnityEngine.Vector3].get_Item (Int32 index) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:225)
BoardManager.RandomPosition () (at Assets/Scripts/BoardManager.cs:75)

这是该项目的实际脚本:

using UnityEngine;
using System; //Allows serializable attribute, which modifies how variables appear
using System.Collections.Generic; //Generic allows use of lists
using Random = UnityEngine.Random; //Used because Random class is in both System and Unity engine namespaces

public class BoardManager : MonoBehaviour 
{
    [Serializable]
    public class Count
    {
        public int maximum;
        public int minimum;

        public Count (int min, int max) //Assignment constructor for Count to set values of min, max when we declare a new Count
        {
            minimum = min;
            maximum = max;
        }
    }

    public int columns = 8; //8x8 gameboard
    public int rows = 8;
    public Count wallCount = new Count(5, 9); //Specifies random range for walls to spawn in each level
    public Count foodCount = new Count(1, 5); //Random range for food spawns
    public GameObject exit; //Variable that holds exit prefab
    public GameObject[] floorTiles; //Game Object Arrays hold our different prefabs to choose between
    public GameObject[] wallTiles;
    public GameObject[] foodTiles;
    public GameObject[] enemyTiles;
    public GameObject[] outerWallTiles;

    private Transform boardHolder; //Manages Hierarchy
    private List<Vector3> gridPositions = new List<Vector3>(); //Declares a private list of Vector3s
    //Tracks all possible positions on gameboard, and keeps track of whether object has been spawned in that position or not

    void InitialiseList()
    {
        gridPositions.Clear();

        for (int x = 1; x < columns - 1; x++) //Nested FOR loops to fill list with each of the positions on our gameboard as a Vector3
        {
            for (int y = 1; y < rows - 1; y++)
            {
                gridPositions.Add(new Vector3(x, y, 0f)); //Adds x and y positions to the list
            }
        }
    }

    void BoardSetup() //Sets up outer wall and floor of gameboard
    {
        boardHolder = new GameObject("Board").transform;

        for (int x = -1; x < columns + 1; x++)
        {
            for (int y = -1; y < rows + 1; y++)
            {
                GameObject toInstantiate = floorTiles[Random.Range(0, floorTiles.Length)]; //Defines a new GameObject
                if (x == -1 || x == columns || y == -1 || y == rows)
                {
                    toInstantiate = outerWallTiles[Random.Range(0, outerWallTiles.Length)];
                }

                GameObject instance = Instantiate(toInstantiate, new Vector3(x, y, 0f), Quaternion.identity) as GameObject;
                //Instantiates a new GameObject. Rotation is always the same. Used as GameObject.
                instance.transform.SetParent(boardHolder);
            }
        }
    }

    Vector3 RandomPosition()
    {
        try
        {
            int randomIndex = Random.Range(0, gridPositions.Count);
            Vector3 randomPosition = gridPositions[randomIndex]; //THROWING AN EXCEPTION
            gridPositions.RemoveAt(randomIndex); //Prevents duplicate position spawns
            return randomPosition;
        }
        catch (Exception ex1)
        {
            Debug.Log(ex1);
            throw;
        }
    }

    void LayoutObjectAtRandom(GameObject[] tileArray, int minimum, int maximum)
    {
        int objectCount = Random.Range(minimum, maximum + 1);
        for (int i = 0; i < objectCount; objectCount++)
        {
            Vector3 randomPosition = RandomPosition();
            GameObject tileChoice = tileArray[Random.Range(0, tileArray.Length)];
            Instantiate(tileChoice, randomPosition, Quaternion.identity);

        }
    }

    public void SetupScene(int level) //Called by the GameManager
    {
        BoardSetup();
        InitialiseList();
        LayoutObjectAtRandom(wallTiles, wallCount.minimum, wallCount.maximum);
        LayoutObjectAtRandom(foodTiles, foodCount.minimum, foodCount.maximum);
        int enemyCount = (int)Mathf.Log(level, 2f); //Scales enemy count based on level
        LayoutObjectAtRandom(enemyTiles, enemyCount, enemyCount);
        Instantiate(exit, new Vector3(columns - 1, rows - 1, 0f), Quaternion.identity);
    }
}

我假设该RandomPositions()函数正在引发异常,尽管我无法找到代码的问题。有没有人看到问题?

4

0 回答 0