我对Coroutine的确切功能略知一二,所以我决定用它创建一个项目。最好的学习方式,不是吗?不管怎样,我在每个关卡的开头都有UI的工作脚本,它会告诉你什么关卡和/或它是否是一个新的检查点(产卵区域)。它还会告诉玩家还剩下多少生命和生命。我现在的问题是WaitForSeconds()没有暂停“检查点”文本,所以它直接进入图形用户界面函数,似乎跳过了检查点(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();
}发布于 2018-08-25 10:11:07
协程从调用者异步运行。当您调用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组件。
https://stackoverflow.com/questions/52013342
复制相似问题