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

Ang*_*nge 1 c# unity-game-engine

我想帮助解决以下问题.我正在做一个简单的游戏,你有一个角色跑,他必须跳过来自他的障碍.

而且我目前在创建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 () {

    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 7

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

(GameObject)Instantiate(myCube, ... 
Run Code Online (Sandbox Code Playgroud)

(GameObject)Instantiate(GameObject.CreatePrimitive(PrimitiveType.Cube), ...
Run Code Online (Sandbox Code Playgroud)

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

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

using UnityEngine;
using System.Collections;

public class randomObstacles : MonoBehaviour {

    public Vector3 spawnLocation;
    public GameObject myCube;

    // Use this for initialization
    void Start () {
        if (myCube != true) {
            Debug.Log("myCube not set");
            myCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        }
        if (myCube.renderer.enabled == false) {
            Debug.Log("myCube not rendered");
            myCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        }
        CreateCube();
    }

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

    void CreateCube() {
        spawnLocation = new Vector3(0, Random.value * 10, 0);
        Instantiate(myCube, spawnLocation, Quaternion.identity);
    }
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*zey 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);
    }
}
Run Code Online (Sandbox Code Playgroud)