StartCoRoutine(string)无法实现预期的效果

时间:2018-08-25 01:31:39

标签: c# unity3d

我对Coroutine的确切功能有较深的了解,因此我决定用它创建一个项目。最好的学习方式,不是吗?无论如何,我在每个级别的开头都有用于UI的工作脚本,它告诉您什么级别和/或它是否是新的检查点(生成区域)。它还告诉玩家还剩下多少健康和生命。我当前的问题是,WaitForSeconds()不会暂停“ Checkpoint”文本,因此它直接进入GUI功能,并且似乎跳过了checkpoint(Cpoint())函数。但是,通过调试日志,我知道事实并非如此。该更改在启动时发生得非常快,以至于在读取之前就消失了。

我将协程注释掉了,因为它不间断运行。我只希望此代码在接触对撞机时起作用。

欢迎所有解释!我在这里学习!另外,如果有人能指出正确的方向,我将不胜感激!

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class txtLvl1 : MonoBehaviour {

// Use this for initialization

public Text checkpointTxt;


void Start () {

}

// Update is called once per frame
void Update () {

    Cpoint();
    StartCoroutine("Wait1");
    GUI();

}

void GUI()
{
    Debug.Log("GUI works");
   // StartCoroutine("Wait1");
    checkpointTxt.fontSize = 12;
    checkpointTxt.text = "Lives = " + HpSc.life + "\nHealth = " + HpSc.HP;


}



IEnumerator Wait() {

    yield return new WaitForSeconds(0.5f);

}

IEnumerator Wait1()
{

    yield return new WaitForSeconds(2);

}

void Cpoint(){

    checkpointTxt.text = "( Checkpoint )";
    checkpointTxt.fontSize = 21;
   // StartCoroutine("Wait1");
    Debug.Log("Cpoint");
    //GUI();

}

1 个答案:

答案 0 :(得分:2)

协程从调用方异步运行。当您调用StartCoroutine时,您的调用函数将启动协程并继续执行。所以当你这样做

void MyFunction()
{
   Debug.Log("1");
   StartCoroutine(Wait());
   Debug.Log("2");        
}

您的程序将在游戏的同一帧更新中打印1,启动协程,然后打印2。您的协程将继续在每个后续帧更新上执行,直到完成为止,但此时它与MyFunction完全分开。这是期望的行为,因为可以想象Unity在继续下一行代码之前是否等待协程结束。如果这是从StartUpdate方法中发生的,那么您的整个游戏将被挂起,并等待协程完成,然后再进行其他操作。

如果要打印某些内容,请等待,然后再打印其他内容并显示GUI,然后在协同程序中完成所有操作。

void Start()
{
   StartCoroutine(PrintAndWait());
}

IEnumerator PrintAndWait()
{
   Debug.Log("1");
   yield return new WaitForSeconds(2);
   Debug.Log("2");
   ShowGui();
}

还有一件事情;协程似乎不间断运行的原因是,您实际上是在每个更新帧开始一个新的协程。那不是您想要的,因为您将一直有数十个协程实例在运行。启动协程并不会停止任何当前正在运行的协程。

您可以通过在OnCollisionEnter方法中启动协程来完成所需的操作。确保按照文档中的说明正确连接Collider组件和RigidBody组件。