Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在每一帧阻止游戏对象重生?_C#_Unity3d_Coroutine - Fatal编程技术网

C# 如何在每一帧阻止游戏对象重生?

C# 如何在每一帧阻止游戏对象重生?,c#,unity3d,coroutine,C#,Unity3d,Coroutine,我遇到了一个小问题,我似乎无法完全理解如何解决,我尝试过无数次更改代码,但都没有成功:( 我以编程方式创建游戏对象,效果很好,但问题是游戏每帧创建一次对象(这并不完全是我想要的)!因此我设置了10秒的时间延迟,但它似乎无法正常工作 public Vector3 spawnLocation; public GameObject myCube; // Use this for initialization void Start () { if (myCube.renderer.enabl

我遇到了一个小问题,我似乎无法完全理解如何解决,我尝试过无数次更改代码,但都没有成功:(

我以编程方式创建游戏对象,效果很好,但问题是游戏每帧创建一次对象(这并不完全是我想要的)!因此我设置了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);
}
对象在每一帧都会无限地出现-_-

谁能帮我指一下我要去的方向吗。 有没有更好的方法来实现这一点

我加了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);
}
延迟起作用,但您仍在更新中实例化多维数据集。 如果要每10秒实例化一个多维数据集,可以执行以下操作:

IEnumerator DelayCreateCube(float delay){

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

}

public void Start()
{
  StartCoroutine(DelayCreateCube());
}
通常(至少在您的情况下)在调用所有
GameObjects
的所有
Update
方法之后,引擎会在每一帧执行协同程序(这取决于协同程序)

当您使用
startcroutine
时,它只是计划稍后执行协同程序,因此不会阻止执行
Update
方法:

StartCoroutine(Delay());
Destroy(myCube, 5);
CreateCube();
在上面的代码中,
Delay
将仅在Update方法返回后执行,因此您实际上没有延迟执行
Destroy
CreateCube
方法

有关协同路由的更详细的描述,请参见此


编辑

还有一个需要考虑的问题。我不知道你到底想做什么,但似乎你想在同一个位置创建和销毁一个原语。如果你没有很好的理由这样做,你可以简单地启用/禁用对象,而不是创建一个新的对象并再次销毁它(为了性能)

我加了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);
}
延迟起作用,但您仍在更新中实例化多维数据集。 如果要每10秒实例化一个多维数据集,可以执行以下操作:

IEnumerator DelayCreateCube(float delay){

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

}

public void Start()
{
  StartCoroutine(DelayCreateCube());
}
通常(至少在您的情况下)在调用所有
GameObjects
的所有
Update
方法之后,引擎会在每一帧执行协同程序(这取决于协同程序)

当您使用
startcroutine
时,它只是计划稍后执行协同程序,因此不会阻止执行
Update
方法:

StartCoroutine(Delay());
Destroy(myCube, 5);
CreateCube();
在上面的代码中,
Delay
将仅在Update方法返回后执行,因此您实际上没有延迟执行
Destroy
CreateCube
方法

有关协同路由的更详细的描述,请参见此


编辑


还有一个需要考虑的问题。我不知道你到底想做什么,但似乎你想在同一个位置创建和销毁一个原语。如果你没有很好的理由这样做,你可以简单地启用/禁用对象,而不是创建一个新的对象并再次销毁它(为了性能).

显然,其他人已经指出,每次更新()时,您都在创建一个多维数据集调用,它是一个游戏循环。假设你只想在一个偶数的时间间隔内创建对象,例如每X秒一次,你就应该考虑使用一个协同程序或一个调用程序。协同程序解决方案已经被解决了,下面给出:

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

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

显然,其他人已经指出了这样一个事实:每次更新()时,您都在创建一个多维数据集调用,它是一个游戏循环。假设你只想在一个偶数的时间间隔内创建对象,例如每X秒一次,你就应该考虑使用一个协同程序或一个调用程序。协同程序解决方案已经被解决了,下面给出:

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

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

每次游戏循环时,你都在调用
CreateCube()
。将其插入
Start()
@David我试过了,但是如果我将
CreateCube()
放入
Start()
中,它只会创建一次游戏对象!我想无休止地创建
myCube
,但有一个时间间隔。//更新()每帧调用一次。如果您是新手,请避免使用它,直到您学会如何实现事件模式,否则您将陷入噩梦。每次游戏循环时,您都会调用
CreateCube()
。将其插入
Start()
@David我尝试过,但如果我将
CreateCube()
放入
Start()
它只创建一次游戏对象!我想无休止地创建
myCube
但有一个时间间隔//每帧调用一次Update()。如果你是新手,请避免使用它,直到你学会如何实现事件模式,否则你会陷入噩梦。你是想在
Start()中调用
DelayCreateCube(delay)
?@Kap:是的,我的错:)。我修复了它。我正在尝试创建一个原语,然后在几秒钟后销毁它,并重复相同的操作。经过一定时间后,我希望能够以3-5秒的间隔同时创建2个或更多的基本体。感谢您的帮助,
myCube
游戏对象现在在我选择的指定延迟后出现。但是,它不会出现在相同的位置…我尝试过调整
SpawnLocation()
,但仍然存在相同的问题。是否有我缺少的东西或有额外的代码行导致此问题?:(你是想调用
Start()
中的
DelayCreateCube(delay)
?@Kap:yes我的错:)。我修复了它。我正在尝试创建一个原语,然后在几秒钟后销毁它,并重复相同的操作。经过一定时间后,我希望能够以3-5秒的间隔同时创建2个或更多的基本体。感谢您的帮助,
myCube
游戏对象现在在我的ch指定延迟后出现