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.此外,对于未来的后代,您可能希望spawnLocation在Start例程中初始化您,并通过替换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);
}
}
Run Code Online (Sandbox Code Playgroud)
可能值得指出的是,您正在方法中创建对象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)