如何以编程方式随机生成GameObjects?

时间:2013-04-24 04:38:09

标签: c# unity3d

我想对以下问题提供一些帮助。我制作了一个简单的游戏,你有一个角色在奔跑,他必须跳过来自他的障碍物。

在创建GameObjects并在运行时在游戏场景中随机生成GameObjects时,我目前陷入困境。

我写了一堂课来帮助实现这个目标:

using UnityEngine;
using System.Collections;

public class randomObstacles : MonoBehaviour {

    public GameObject myCube;
    public Vector3 spawnLocation = new Vector3(0,2,0);

    // Use this for initialization
    void Start () {
        GameObject SpawnLocation = (GameObject)Instantiate(myCube, spawnLocation, Quaternion.identity);
    }

    // Update is called once per frame
    void Update () {

    }
}

上面的代码是我写的,只是一个接一个地创建对象。但是当我运行游戏时,它会出现空白-_-!

任何人都可以告诉我哪里出错了,从我看来,我的代码似乎没有做我希望实现的目标:(

我已将上述脚本附加到一个空的GameObject中,正如我在Unity社区论坛的教程中看到的那样,但这也没有帮助。 (我看了看周围似乎没有人遇到过这样的问题 - 我可能错了)

3 个答案:

答案 0 :(得分:7)

看起来你的myCube变量是你问题的根源,在我自己的场景中进行了测试。通过替换

(GameObject)Instantiate(myCube, ... 

(GameObject)Instantiate(GameObject.CreatePrimitive(PrimitiveType.Cube), ...

我能够在(0,2,0)处生成一个没有疑虑的立方体。也许你的myCube GameObject缺少一个网格渲染器,在这种情况下,它会在运行时出现在层次结构中,即使它在游戏视图中看起来不可见。在运行游戏之前,您可能没有在Inspector中分配它,在这种情况下,myCube变量将引用null,因此不会被创建。另外,虽然您可能正在分配GameObject实例化为SpawnLocation,但它是一个未使用的局部变量(MonoDevelop或您的代码编辑器应该通知您)。确保在运行时之前在Inspector中提供对myCube GameObject的引用,或者在运行时通过脚本引用加载的预制件/ GameObject。提供一个回退(比如PrimitiveType.Cube或许?)也会有所帮助,这将使你的代码更加健壮,并且能够在引用时处理错误。

无论如何,为了实现您所描述的功能,首先要确保您已经准备好了您想要的任何内容myCube。此外,对于未来的后代,您可能需要在spawnLocation例程中初始化Start,并通过将Random.value * yourValueCeiling替换为您想要的每个随机坐标来分配变量坐标{{1}生成的。您甚至可以将辅助方法外化,从而独立于启动例程,这样您就不必拥有一百个单个脚本实例来创建所需内容的百个实例;相反,您可以通过单个脚本调用该方法,并以这种方式避免麻烦。如果您如此欣赏它,这是我实现您的目标,希望这有帮助!

myCube

答案 1 :(得分:7)

可能值得指出的是,您正在使用Start方法创建对象,这意味着您的代码只会运行一次:从您的类名称开始,我假设您要创建更多使用此代码的对象不止一个。

如果您将代码移到Update,则每个框架会创建一个对象,这很可能太多了。我的猜测是你想要一个像随机间隔运行的协程,然后随着时间的推移重复产生立方体,如下所示:

void Start () {
    StartCoroutine("SpawnObjects");
}

IEnumerator SpawnObjects()
{
    while (keepAddingObjects) // a boolean - could just be "true" or could be controlled elsewhere
    {
        GameObject SpawnLocation = (GameObject)Instantiate(myCube, spawnLocation, Quaternion.identity);
        float delay = Random.Range(1f, 5f); // adjust this to set frequency of obstacles
        yield return new WaitForSeconds(delay);
    }
}

答案 2 :(得分:2)

从我自己的代码中获取自动生成迷宫的游戏:

public class Cell
{
    private GameObject instance;

    public void CreateVisual()
    {
        // Load a GameObject that exist inside the "Resources" folder.
        GameObject prefab = (GameObject)Resources.Load("Models/Walls/3W1"); 

        // Create an instance of the prefab
        instance = (GameObject)GameObject.Instantiate(prefab);
        instance.transform.position = myPosition;
    }
}

我认为您缺少的部分是Resources.Load()方法。