【问题标题】:How do I stop GameObjects from respawning at every frame?如何阻止游戏对象在每一帧重生?
【发布时间】:2013-05-01 19:47:55
【问题描述】:

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

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

对象在每一帧都无休止地出现-_-

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

【问题讨论】:

  • 每次游戏循环时,您都会调用CreateCube()。贴在Start()
  • @David 我试过了,但是如果我将CreateCube() 放在Start() 中,它只会创建一次游戏对象!我想无休止地创建myCube,但有一个时间间隔。
  • // 每帧都会调用 Update()。如果您是新手,请避免使用它,直到您了解如何实现事件模式,否则您将陷入噩梦。

标签: c# unity3d coroutine


【解决方案1】:

我设置了 10 秒的时间延迟,但它似乎不起作用 正确。

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

IEnumerator DelayCreateCube(float delay){

    while(true)
    {
      yield return new WaitForSeconds(10);
      Instantiate(myCube, spawnLocation, Quaternion.identity);
    }

}

public void Start()
{
  StartCoroutine(DelayCreateCube());
}

引擎通常在所有GameObjects 的所有Update 方法被调用后立即(至少在您的情况下)在每一帧执行协程(嗯,这取决于协程)。

当你使用StartCoroutine时,它只是调度协程稍后执行,所以它不会阻塞Update方法的执行:

StartCoroutine(Delay());
Destroy(myCube, 5);
CreateCube();

在上面的代码中,Delay 将仅在 Update 方法返回后执行,因此您实际上并没有延迟 DestroyCreateCube 方法的执行。

有关协程的更详细描述,请查看article


编辑

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

【讨论】:

  • 你的意思是打电话给Start()中的DelayCreateCube(delay)吗?
  • @Kap:是的,我的错 :)。我修好了。
  • 我正在尝试创建一个基元,然后在几秒钟后将其销毁并重复相同的操作。一段时间后,我希望能够以 3-5 秒的间隔同时创建 2 个或更多图元。
  • 感谢您的帮助,myCube 游戏对象现在在我选择的指定延迟后出现。但是,它没有出现在同一个位置...我尝试调整SpawnLocation(),但我仍然遇到同样的问题。是否有我遗漏的东西或有额外的代码行导致此问题? :(
【解决方案2】:

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

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

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

【讨论】:

  • +1:很高兴知道,我不知道。可能使用已经在引擎中实现的协程比编写自己的代码还要快。谢谢
猜你喜欢
  • 1970-01-01
  • 2023-01-02
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
相关资源
最近更新 更多