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

时间:2019-09-05 18:55:56

标签: c# unity3d

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

-游戏对象
----- PEGA
---------手臂
--------- Base

对不起,我不知道如何表示层次结构。

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

很明显,我可以在ring类中“ 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"));
    }
}

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

有人可以解释吗?

1 个答案:

答案 0 :(得分: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"));
    }
}

结论:您应该初始化自己的类,并且通常使用new关键字来初始化类。除非这些类是从MonoBehaviour继承的类,否则应使用AddComponent方法初始化这些类。如果您不这样做,那么Unity将不会管理这些类的内存,并且会告诉您使用AddComponent的错误。