2015-01-29 3 views
0

В моей игре игроки смогут выбирать единицы из меню, которые впоследствии будут использоваться (размещаться) в разных сценах.Сохраните сборные файлы в массиве

Для этого я хочу сохранить сборные блоки в статическом массиве с помощью кода.
Затем я хочу получить доступ к этим сборникам, чтобы отобразить некоторые из их переменных, объявленных в прикрепленных сценариях (например, имя, мощность и текстура эскизов) для отображения в пользовательском интерфейсе. Позже я хочу создать их в сценах.

До сих пор я не смог сохранить эти сборники в массиве.

Мой код:

//save to array 
if (GUI.Button(Rect(h_center-30,v_center-30,50,50), "Ship A")){ 
    arr.Push (Resources.Load("Custom/Prefabs/Ship_Fighter") as GameObject); 
} 

//display on UI 
GUI.Label (Rect (10, 10, 80, 20), arr[i].name.ToString()); 

Из последней строки, я получаю эту ошибку:

<i>" 'name' is not a member of 'Object'. "</i> 

Так, где моя ошибка? Забыл ли я что-то или объявил это неправильно, или мой подход здесь недействителен для начала (т. Е. Prefabs не могут быть сохранены/доступны таким образом, другой тип списка лучше подходит для этой задачи).

ответ

0

Вы объявили массив без типа. Вы можете объявить массив как список GameObject s или отбросить элементы при их извлечении.

Пример отливки типа:

GUI.Label (Rect (10, 10, 80, 20), ((GameObject)arr[i]).name.ToString());  

// which is equivalent to 
GameObject elem = (GameObject)arr[i]; 
GUI.Label (Rect (10, 10, 80, 20), elem.name.ToString()); 

Пример использования общего списка:

// Add this line at the top of your file for using Generic Lists 
using System.Collections.Generic; 

// Declare the list (you cannot add new elements to an array, so better use a List) 
static List<GameObject> list = new List<GameObject>(); 

// In your method, add elements to the list and access them by looping the array 
foreach (GameObject elem in list) { 
    GUI.Label (Rect (10, 10, 80, 20), elem.name.ToString()); 
} 

// ... or accessing by index 
GameObject[] arr = list.ToArray; 
GUI.Label (Rect (10, 10, 80, 20), arr[0].name.ToString()); 
+0

Во-первых, спасибо за быстрый ответ. Во-вторых: Я использую UnityJS, а не C#. Следовательно, я использовал массив JS, который не имеет объявленного типа (я безуспешно искал способ его определения).
Итак, чтобы получить определенный тип, я переключился на общий список, который, по крайней мере, не вызывает ошибок в редакторе.
Однако, когда я запускаю сцену и нажимаю кнопку, игровой объект, добавленный в список, пуст, что приводит к ошибке, когда скрипт пытается получить доступ к его имени.
Так что, по-видимому, способ сохранения сборника в списке не работает. Где я иду не так? – Tuxedomask

+0

@ user3802640 Тег 'C#' путал меня. В любом случае ошибка связана с тем, что вы пытаетесь получить доступ к свойству 'name' класса' Object' (который не имеет этого свойства). Приведение элемента массива в 'GameObject' должно решить вашу проблему. – redent84

+0

Что мне теперь делать: ** Вставка ** \t 'arr.Add (Resources.Load ("Пользовательский/Prefabs/Ship_Fighter.prefab"), как GameObject);' ** Чтение: ** 'GUI.Label (Rect (10, 10, 80, 20), (arr [i] как GameObject) .name.ToString()); ' Тем не менее, созданный игровой объект остается пустым, и я получаю эту ошибку: _" Ссылка на объект не установлена экземпляр объекта "_ Однако, когда я перетаскиваю сборку в пустой игровой объект в инспекторе, имя отображается как предназначено. Я думаю, что что-то не так с тем, как я позволяю единству читать сборник. – Tuxedomask

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