我有一个名为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”在屏幕上是三个球。我知道他们会处于相同的位置,但这没关系。另外,当我说三个球时,我的意思是代码执行后会有三个球。上面的代码应该创建两个。以下是检查员的球对象图像:
Ball
脚本是唯一被删除图像的东西。
当我尝试代码时,它会说:
问题:我如何解决此问题并获得所需的三个球来显示。谢谢你的帮助!
答案 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);