1

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

我正在以编程方式创建游戏对象,效果很好,但问题是游戏每帧创建一次对象(不完全是我想要的)!所以我设置了 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);
}

物体在每一帧都无休止地出现-_-

谁能帮我指出正确的方向。有没有更好的方法来实现这一目标?

4

2 回答 2

3

我已经延迟了 10 秒,但它似乎无法正常工作。

延迟有效,但您仍在更新内部实例化多维数据集。如果您想每 10 秒实例化一个 Cube,您可以执行以下操作:

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方法的执行。

有关协程的更详细描述,请查看这篇文章


编辑

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

于 2013-05-01T20:10:59.717 回答
1

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

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

void CreateCube()
{
    // create your cube here
}
于 2013-05-02T22:24:00.613 回答