我想对以下问题提供一些帮助。我制作了一个简单的游戏,你有一个角色在奔跑,他必须跳过来自他的障碍物。
在创建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社区论坛的教程中看到的那样,但这也没有帮助。 (我看了看周围似乎没有人遇到过这样的问题 - 我可能错了)
答案 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()
方法。