如何阻止GameObjects在每一帧重生?

时间:2013-05-01 19:47:56

标签: c# unity3d coroutine

我遇到过这个小问题,我似乎无法完全理解如何解决,我已经尝试过无数次更改我的代码但是我没有得到任何地方:(

我正在以编程方式创建游戏对象,但工作正常,但问题是游戏每帧创建一次对象(不完全是我想要的)!所以我已经延迟了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);
}

对象在每一帧-_-

无休止地出现

有没有人可以帮我指出正确的方向。 是否有更好的方法来实现这一目标?

2 个答案:

答案 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方法后才会执行,因此您实际上并没有推迟DestroyCreateCube方法的执行。

有关协同程序的更详细说明,请查看此article


修改

只是一个额外的考虑因素。我不确切地知道你想要做什么,但似乎你想要始终在同一个位置创建和销毁基元。如果你没有充分的理由这样做,你可以简单地enable/disable对象而不是创建一个新对象并再次销毁它(对于表演)。

答案 1 :(得分:1)

显然,其他人已经指出,每次调用Update()时都会创建一个多维数据集,这是每个游戏循环一次。假设您只想以均匀的时间间隔创建对象,例如每隔X秒,您应该考虑使用Coroutine或InvokeRepeating。协程解决方案已经解决,InvokeRepeating如下:

void Start()
{
  InvokeRepeating("CreateCube", 1.0f, 1.0f);
}

void CreateCube()
{
    // create your cube here
}