2015-04-08 2 views
1

У меня есть prefabs, названный с 0, 1 ... 9.Индекс массива выходит за пределы диапазона?

Я хочу создать цифры с rigidbody и collision. Однако я получаю исключение ниже:

IndexOutOfRangeException: Индекс массива выходит за пределы допустимого диапазона. (обертка stelemref) объект: stelemref (объект, IntPtr, объект) Spawn_Score.Start() (на активы/Spawn_Score.cs: 17)

Код:

using UnityEngine; 
using System.Collections; 

public class Spawn_Score : MonoBehaviour { 

    private Vector3 startPosition; 
    private Quaternion startRotation; 

    public GameObject[] number_object; 

    public int position; 
    public int count; 

    // Use this for initialization 
    void Start() { 
    for (int i = 0; i < 9; i++) { 
     number_object [i] = (GameObject)Resources.Load (i.ToString()); 
    } 
    GenerateScore(); 
    } 

    // Update is called once per frame 
    void Update() { 

    } 

    void GenerateScore() { 
    startRotation = transform.rotation; 
    count = PlayerPrefs.GetInt ("PlayerScore").ToString().Length; 
    for (int i = 1; i < count; i++) { 
     //int number; 
     startPosition = new Vector3 (2f*i, 5.6f, 0); 
     //number = (int)PlayerPrefs.GetInt("PlayerScore").ToString()[i]; 
     Instantiate (number_object[1], startPosition, startRotation); 
    } 
    } 
} 
+0

Вы не показали нам, где инициализируется 'номер_объекта'. (Вы показали нам, где массив заполнен, но не там, где вы фактически инициализируете переменную.) –

+0

Это все, что у меня есть. Разве номер_объекта не инициализирован в верхней части страницы? Если я прав. – Epz

+0

Нет, это * объявлено * в начале кода, но оно будет иметь значение по умолчанию «null». Поэтому что-то должно быть инициализировано, иначе вы получите «NullReferenceException». Вполне возможно, что какая-то волшебная часть Unity инициализирует его автоматически, но я не вижу, как он будет знать, как большой размер массива. –

ответ

0

Вы должны поставить манекен заполнители для общедоступного GameObject [] number_object; в вашем редакторе. Вы не можете динамически генерировать, не зная размера. Вы динамически пытаетесь заполнить и размер [] перед инициализацией. Это не стек, потому что вы не можете толкать и всплывать пополам. Я бы поставил фиктивный объект prefab (точнее, 9), тот же самый. Таким образом, вы выделите 9 объектов, и размер будет согласован, и вы сможете заполнить change_object [i] в ​​любое время!

Создайте dummy_prefab и размер массива GameObject в Unity до 9, а затем выберите dummy_prefab как одно и то же значение для каждого. Они будут заполнителями, неважно, являются ли они одинаковыми или разными случайными типами GameObject!

В UnityScript я сделал что-то подобное в своей игре. Обратите внимание, что это не в C#, а в JS. Но для LevelPieces и LevelPiecesXPosition мне пришлось в раннем размере доработать его в редакторе. У меня была такая же ошибка массива, прежде чем я сделал это следующим образом:

public var LevelPieces: GameObject[]; 
public var LevelPiecesXPosition: float[]; 

function Start { 

    for (var x:int=0;x < LevelPieces.Length;x++) { 
     var temp:GameObject = Instantiate(LevelPieces[x], Vector3(LevelPiecesXPosition[x],0,0), Quaternion.Euler(0,0,0)); 
    } 

} 
Смежные вопросы