我想在运行时创建一个对象数组

Max*_*tax -2 c# unity-game-engine

我正在创建一个版本的河内塔拼图。它在 Unity 层次结构中的表示方式是

-游戏对象
-----PegA
---------Arm
---------Base

抱歉,我不知道如何表示层次结构。

场景中有 3 个“钉子”和 7 个“环”作为对象。钉和环在层次结构中处于同一级别。

很明显,我可以“SerializeField”环类,只需在检查器中单击每个 Peg 并将其拖到它们上,但我想要做的只是在运行时将它们添加到代码中。这是我尝试过的。

这是我的戒指课程的一部分

public class ring : MonoBehaviour
{
    public bool locked, resting;
    private float startX, startY, deltaX, deltaY;
    private Vector3 mousePos, beforeDrag;

    private List<GameObject> pegs;

    // Start is called before the first frame update
    void Start()
    {
        startX = transform.position.x;
        startY = transform.position.y;
        locked = false;
        pegs.Add(GameObject.Find("PegA"));
        pegs.Add(GameObject.Find("PegB"));
        pegs.Add(GameObject.Find("PegC"));
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是“对象引用未设置为对象的实例”

有人可以解释一下吗?

Cod*_*rer 6

public class ring : MonoBehaviour
{
    //These are value types they have a default value
    public bool locked, resting;// bool default value is false
    private float startX, startY, deltaX, deltaY; // float is zero
    private Vector3 mousePos, beforeDrag;// Vector3 is Vector3.zero
    // This does not have a "default" value cos this is a reference type
    private List<GameObject> pegs = new List<GameObject>();

    // Start is called before the first frame update
    void Start()
    {
        startX = transform.position.x;
        startY = transform.position.y;
        locked = false;
        pegs.Add(GameObject.Find("PegA"));
        pegs.Add(GameObject.Find("PegB"));
        pegs.Add(GameObject.Find("PegC"));
    }
}
Run Code Online (Sandbox Code Playgroud)

结论您应该初始化您自己的类,并且通常使用 new 关键字初始化类。除非这些是从 MonoBehaviour 继承的类,否则应使用该AddComponent方法初始化这些类。如果您不执行这些操作,Unity 将不会管理这些类的内存,并且会提示您使用 AddComponent 的错误。

  • @MaxAttax 这实际上是与您相同的脚本,只是正确设置了注释和钉子...... (3认同)
  • @MaxAttax pegs 不是关键字“pegs”是您的 List&lt;GameObject&gt; 集合名称 (2认同)