生成一个游戏对象的三个实例

时间:2016-05-17 05:53:19

标签: c# unity3d

我有一个名为ball的对象,按下“b”按钮后,我希望其中有三个。这三个将基于第一个球的位置。这是我尝试执行此操作的代码。

public class TripleBall : MonoBehaviour {

public Ball firstBall;
private int amountOfBalls = 2;
private Ball[] ballArray;
private bool start, avail, located;
void Start () {
    ballArray = new Ball[amountOfBalls - 1];
    start = false;

    for (int i = 0; i < ballArray.Length; i++)
        ballArray[i] = gameObject.AddComponent<Ball>();


}

// Update is called once per frame
void Update () {
    if (Input.GetKeyDown(KeyCode.B))
        start = true;
    if (start)
    {
        //Begin locator: Makes it so when the balls spawn they spawn where the first ball
        if (!located) {
            for (int i = 0; i < ballArray.Length; i++)
            {

                ballArray[i].transform.position = firstBall.transform.position;
            }
            located = true;
        }
        //End locator : if statement and loop


    }

}

}

我想要那里,当我点击“b”在屏幕上是三个球。我知道他们会处于相同的位置,但这没关系。另外,当我说三个球时,我的意思是代码执行后会有三个球。上面的代码应该创建两个。以下是检查员的球对象图像:

enter image description here

Ball脚本是唯一被删除图像的东西。

当我尝试代码时,它会说:

enter image description here

问题:我如何解决此问题并获得所需的三个球来显示。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

您的错误意味着您正在调用附加到TripleBall对象的RigidBody,但其上没有严格的内容。访问RigidBody时,您应该检查它是否为null或确定对象上有一个。

你的第二个问题是数组声明。

Ball[amountOfBalls - 1];

这将使数组1的大小小于amountOfBalls(在这种情况下为1而不是预期的2)。只需删除- 1

即可
Ball[amountOfBalls];

最后一个问题是

ballArray[i] = gameObject.AddComponent<Ball>(); 

只需在你的对象gameObject(当前对象)上创建一个新的脚本Ball。所以你的数组都将引用不同的脚本,但是在所有相同的对象上。因为您想要拥有球对象的副本,所以您必须使用Instantiate方法。这允许您从其他对象甚至是预制件实例化gameObject。以下是如何在您的情况下实现它。

ballArray[i] = (Ball)Instantiate(firstBall);