在 Unity C# 中实例化游戏对象列表

Gra*_*Fur 2 c# list unity-game-engine gameobject

如何使用 c# 在 Unity3D 中实例化 GameObject 列表?我在检查器窗口中用预制件手动填充列表。

在此处输入图片说明

下面是我在 Deck.cs 中编写的代码,但我得到“对象引用未设置为对象的实例”。如果你有一个数组的解决方案,那也将不胜感激。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.UI;

namespace Assets
{
    class Deck:MonoBehaviour
    {
        public List<GameObject> deck;
        public void Fill()
        {
            GameObject c1 = Instantiate(deck[0]);
            GameObject c2 = Instantiate(deck[1]);
            GameObject c3 = Instantiate(deck[2]);
            GameObject c4 = Instantiate(deck[3]);
            GameObject c5 = Instantiate(deck[4]);
            GameObject c6 = Instantiate(deck[5]);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

我也试过用一个数组来做,我得到“你想实例化的对象是空的”

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.UI;

namespace Assets
{
    class Deck:MonoBehaviour
    {
        public GameObject card1;
        public GameObject card2;
        public GameObject card3;
        public GameObject card4;
        public GameObject card5;
        public GameObject card6;

        public GameObject[] deck;

        public void Start ()
        {
            deck = new GameObject[5];
            GameObject c1 = Instantiate(card1) as GameObject;
            GameObject c2 = Instantiate(card2) as GameObject;
            GameObject c3 = Instantiate(card3) as GameObject;
            GameObject c4 = Instantiate(card4) as GameObject;
            GameObject c5 = Instantiate(card5) as GameObject;
            GameObject c6 = Instantiate(card6) as GameObject;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

Kar*_*dux 5

好吧,考虑到您的评论以及您提供的第一个脚本完美运行而没有任何错误(应该如此:它没有理由应该返回错误),我觉得您对 Unity 很陌生。

因此,我建议您先查看 Unity 教程(它们制作精良,将帮助您了解引擎的基础知识)。你可以在这里找到滚球教程

关于你的问题:

1-在第一个脚本中,该Fill()方法未在任何地方调用,您必须执行以下操作:

private void Start()
{
    Fill();
}
Run Code Online (Sandbox Code Playgroud)

2-Start()方法来自MonoBehaviour父类(以及Update()每帧调用的方法)并在场景开始时调用一次。看看这张图表以了解统一流程是如何形成的。

3-使用 aList<GameObject>或 aGameObject[]取决于您的情况:如果集合的大小将发生变化,请查找列表。否则建议使用数组。

4-考虑到你的脚本,我猜它应该是这样的:

namespace Assets
{
    class Deck : MonoBehaviour
    {
        [SerializeField]
        private GameObject[] deck;

        private GameObject[] instanciatedObjects;

        private void Start()
        {
            Fill();
        }

        public void Fill()
        {
            instanciatedObjects = new GameObject[deck.Length];
            for (int i = 0; i < deck.Lenght; i++)
            {
                instanciatedObjects[i] = Instanciate(deck[i]) as GameObject;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果需要,您当然仍然可以使用列表:)

编辑:
如果你想使用一个列表,你只需要:

  • 更改private GameObject[] instanciatedObjects;private List<GameObject> instanciatedObjects;
  • 替换instanciatedObjects = new GameObject[deck.Length];instanciatedObjects = new List<GameObject>();
  • 替换instanciatedObjects[i] = Instanciated(deck[i]) as GameObject;instanciateObjects.Add(Instanciated(deck[i]) as GameObject);

希望这可以帮助,