1

我想要一些关于以下问题的帮助。我正在制作一个简单的游戏,你有一个角色在奔跑,他必须跳过向他而来的障碍物。

我目前在创建游戏对象并在运行时在游戏场景中随机生成它们时遇到了困难。

我写了一个类来帮助实现这一点:

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 () {

    }
}

上面的代码是我为了简单地创建对象而编写的,一个接一个。但是当我运行游戏时,它出现空 -_- !

谁能告诉我哪里出了问题,从外观上看,我的代码似乎没有达到我希望达到的效果:(

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

4

3 回答 3

7

似乎您的myCube变量是您问题的根源,在我自己的场景中对其进行了测试。通过代入

(GameObject)Instantiate(myCube, ... 

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

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

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

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);
    }
}
于 2013-04-24T06:22:22.180 回答
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);
    }
}
于 2013-04-24T07:04:12.403 回答
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()方法。

于 2013-04-24T04:58:44.570 回答