Unity — как установить значение в массиве в сборном файле при создании экземпляра

#unity3d

#unity3d

Вопрос:

Я создаю несколько сборных экземпляров и мне нужно задать пути. Длина узлов пути составляет от 1 до 3 секций.

 public GameObject mb;

void Start()
    {
        GameObject planeIcon;
        foreach (PlaneData p in PlaneManager.planesData)
        {
            if(p.route != 0)
            {
                planeIcon = Instantiate(iconPrefab);
                planeIcon.GetComponent<Image>().sprite = Resources.Load<Sprite>(p.planeFilename   "_icon");
                planeIcon.name = p.planeName;
                planeIcon.GetComponent<AnimatePlane>().moveSpeed = p.planeSpeed;
                planeIcon.GetComponent<AnimatePlane>().range = p.planeRange;

                planeIcon.GetComponent<AnimatePlane>().pathNode[0] = mb;
}
  

это вызывает исключение IndexOutOfRangeException: индекс был за пределами массива в последней строке

Код AnimatePlane прикреплен к сборке, экземпляр которой создан выше

 public class AnimatePlane : MonoBehaviour
{
    public GameObject[] pathNode = new GameObject[3];
    public float moveSpeed;
    public int range;

    // Use this for initialization
    void Start()
    {
        Debug.Log("pathnode length: "   pathNode.Length);
        CheckNode();
    }
  

Вывод отладки — показать длину путевого узла = 0
Я предполагаю, что мне нужно каким-то образом инициализировать массив в коде AnimatePlane, но не могу понять, чего мне не хватает.
Спасибо

Ответ №1:

Привет, попробуй это.

     public GameObject mb;
    
    void Start()
        {
            GameObject planeIcon;
            foreach (PlaneData p in PlaneManager.planesData)
            {
                if(p.route != 0)
                {
                    planeIcon = Instantiate(iconPrefab);
                    planeIcon.GetComponent<Image>().sprite = Resources.Load<Sprite>(p.planeFilename   "_icon");
                    planeIcon.name = p.planeName;
                    AnimatePlane plane = planetIcon.GetComponent<AnimatePlane>();

                    plane.moveSpeed = p.planeSpeed;
                    plane.range = p.planeRange;
                    plane.pathNode = new GameObject[3];
                    plane.pathNode[0] = mb;
    }
  

Ответ №2:

При этом «public GameObject[] pathNode = new GameObject[3];» путь к объекту перезаписывается нулевым значением. Вам не нужно создавать общедоступные игровые объекты. Вы можете установить размер в инспекторе Unity и добавить туда объекты.

Комментарии:

1. Я не могу добавлять объекты через инспектор, поскольку это сборный файл, для которого при создании экземпляра требуется набор переменных. Спасибо за предложение, хотя.