我遇到过这个小问题,我似乎无法完全理解如何解决,我已经尝试过无数次更改我的代码但是我没有得到任何地方:(
我正在以编程方式创建游戏对象,但工作正常,但问题是游戏每帧创建一次对象(不完全是我想要的)!所以我已经延迟了10秒,但似乎没有正常工作。
public Vector3 spawnLocation;
public GameObject myCube;
// Use this for initialization
void Start () {
if (myCube.renderer.enabled == false) {
Debug.Log("myCube not rendered");
myCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
}
if (myCube == null) {
Debug.Log("myCube not set");
myCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
}
}
// Update is called once per frame
void Update () {
StartCoroutine(Delay());
Destroy(myCube, 5);
CreateCube();
}
void CreateCube() {
spawnLocation = new Vector3(24, 17, -28);
StartCoroutine(Delay());
Instantiate(myCube, spawnLocation, Quaternion.identity);
}
IEnumerator Delay(){
yield return new WaitForSeconds(10);
}
对象在每一帧-_-
无休止地出现有没有人可以帮我指出正确的方向。 是否有更好的方法来实现这一目标?
答案 0 :(得分:3)
我已经延迟了10秒,但似乎没有用 正常。
延迟有效,但您仍然在Update中实例化多维数据集。 如果你想每10秒实例化一个立方体,你可以做以下事情:
IEnumerator DelayCreateCube(float delay){
while(true)
{
yield return new WaitForSeconds(10);
Instantiate(myCube, spawnLocation, Quaternion.identity);
}
}
public void Start()
{
StartCoroutine(DelayCreateCube());
}
在调用了所有Update
的所有GameObjects
方法之后,协程会在每一帧(好吧,它取决于协同程序)执行协同程序(至少在您的情况下)。
使用StartCoroutine
时,它只是安排稍后执行的协程,因此它不会阻止Update
方法的执行:
StartCoroutine(Delay());
Destroy(myCube, 5);
CreateCube();
上面代码中的 Delay
只有在返回Update方法后才会执行,因此您实际上并没有推迟Destroy
和CreateCube
方法的执行。
有关协同程序的更详细说明,请查看此article。
修改
只是一个额外的考虑因素。我不确切地知道你想要做什么,但似乎你想要始终在同一个位置创建和销毁基元。如果你没有充分的理由这样做,你可以简单地enable/disable
对象而不是创建一个新对象并再次销毁它(对于表演)。
答案 1 :(得分:1)
显然,其他人已经指出,每次调用Update()时都会创建一个多维数据集,这是每个游戏循环一次。假设您只想以均匀的时间间隔创建对象,例如每隔X秒,您应该考虑使用Coroutine或InvokeRepeating。协程解决方案已经解决,InvokeRepeating如下:
void Start()
{
InvokeRepeating("CreateCube", 1.0f, 1.0f);
}
void CreateCube()
{
// create your cube here
}