我对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();
}
答案 0 :(得分:2)
协程从调用方异步运行。当您调用StartCoroutine
时,您的调用函数将启动协程并继续执行。所以当你这样做
void MyFunction()
{
Debug.Log("1");
StartCoroutine(Wait());
Debug.Log("2");
}
您的程序将在游戏的同一帧更新中打印1
,启动协程,然后打印2
。您的协程将继续在每个后续帧更新上执行,直到完成为止,但此时它与MyFunction
完全分开。这是期望的行为,因为可以想象Unity在继续下一行代码之前是否等待协程结束。如果这是从Start
或Update
方法中发生的,那么您的整个游戏将被挂起,并等待协程完成,然后再进行其他操作。
如果要打印某些内容,请等待,然后再打印其他内容并显示GUI,然后在协同程序中完成所有操作。
void Start()
{
StartCoroutine(PrintAndWait());
}
IEnumerator PrintAndWait()
{
Debug.Log("1");
yield return new WaitForSeconds(2);
Debug.Log("2");
ShowGui();
}
还有一件事情;协程似乎不间断运行的原因是,您实际上是在每个更新帧开始一个新的协程。那不是您想要的,因为您将一直有数十个协程实例在运行。启动协程并不会停止任何当前正在运行的协程。
您可以通过在OnCollisionEnter方法中启动协程来完成所需的操作。确保按照文档中的说明正确连接Collider
组件和RigidBody
组件。