将对象实例化为Unity

时间:2016-05-17 06:34:55

标签: c# unity3d

我正在尝试创建对名为Ball的对象的多个引用,以便在进行此类操作时屏幕上会有多个球。但是,我似乎无法弄清楚如何做到这一点。以下是我试图实现这一目标的方法:

private GameObject reference;
private Ball[] ballArray;
void Start () {
    reference = GameObject.FindGameObjectWithTag("ball");
    ballArray = new Ball[amountOfBalls - 1];
    start = false;

    for (int i = 0; i < ballArray.Length + 1; i++)
    {
        ballArray[i] = Instantiate(reference);
        print("Initialized: " + (i + 1) + " times.");

    }


}

当我这样做时,我收到以下错误

Cannot implicitly convert type 'UnityEngine.GameObject' to 'Ball'

但是,如果我将ballArray的类型更改为Object它可以正常工作并且不会出现任何错误,但是如果它是类型的话我无法访问Ball的方法Object。我需要这些方法。

问题:我如何才能完成这项工作并仍然可以访问我的Ball类方法?

这是一个进一步明确我需要做什么的例子

    void Update () {
    for (int i = 0; i < ballArray.Length + 1; i++) {

        if (ballArray[i].isOffScreen()) {
            print("Ball #" + (i+1) + " is off screen");
        }

    }

}

我需要能够从isOffScreen类访问Ball方法。

感谢先进的任何帮助!

2 个答案:

答案 0 :(得分:2)

将GameObject实例化并存储到临时GameObject,然后使用GetComponent获取附加到其上的Ball脚本的实例。

for (int i = 0; i < ballArray.Length; i++)
{
    GameObject tempObj = (GameObject)Instantiate(reference);
    ballArray[i] = tempObj.GetComponent<Ball>();
}

这解决了

  

无法隐式转换类型&#39; UnityEngine.GameObject&#39;到&#39; Ball&#39;

错误。

您的上一个问题已得到纠正。请停止这样做:ballArray = new Ball[amountOfBalls - 1];。简单做ballArray = new Ball[amountOfBalls];

要获取更新代码,请使用以下代码:

void Update () {
  for (int i = 0; i < ballArray.Length; i++) 
   {
        if (ballArray[i].isOffScreen()) {
            print("Ball #" + (i+1) + " is off screen");
        }
    }
}

请注意,我从两个代码块中删除了所有for (int i = 0; i < ballArray.Length + 1; i++),并将其替换为for (int i = 0; i < ballArray.Length; i++)。这是正确的方法。

答案 1 :(得分:1)

您可以将ballArray的数据类型更改为

List<GameObject> ballArray = new List<GameObject>();

所以要调用isOffScreen方法,

ballArray[i].getComponent<Ball>().isOffScreen()

<强>更新

结束结果

private GameObject reference;
private List<GameObject> ballArray;
void Start()
{
    reference = GameObject.FindGameObjectWithTag("ball");
    ballArray = new List<GameObject>();
    start = false;

    for (int i = 0; i < amountOfBalls; i++)
    {
        ballArray.Add(Instantiate(reference));
        print("Initialized: " + (i + 1) + " times.");

        if (ballArray[i].GetComponent<Ball>().IsOffScreen())
        {
            print("Ball #" + (i + 1) + " is off screen");
        }
    }


}