【问题标题】:How do I know if a Coroutine is still "waiting"? [closed]我如何知道协程是否仍在“等待”? [关闭]
【发布时间】:2020-10-28 16:08:49
【问题描述】:

我在网上只能找到“如何检查协程是否正在运行”,这不是我想要的。

如果我有协程的话就说

yield return new WaitUntil(()=> SomeBool);

有没有办法知道这个语句是否仍然“待定”?

因为如果我使用布尔技巧,例如

isRunning = true;
yield return new WaitUntil(()=>SomeBool);
isRunning = false;

如果我在 SomeBool 设置为 true 之前停止协程,isRunning 标志将“始终”为 true

我测试过确实是这样! yield 语句之后的任何内容都不会运行!

而且由于它从未运行过,任何检查都是无用的,无论是isRunning 还是SomeBool

所以“检查协程是否还在运行”的功能失败了!

有没有办法“做正确的工作”?

所以如果我最终从另一部分代码中将SomeBool 设置为true,我知道还有一个WaitUntil 在等待它吗?如果不是,那么以某种方式重新启动协程,这样它就不会“永远卡住并导致游戏崩溃”!?

非常感谢!

【问题讨论】:

  • "如果我在 SomeBool 设置为 true 之前停止协程,isRunning 标志将“始终”为 true,对吗?"是什么让你认为是这样的?您是否真的进行了测试并了解实际发生了什么?
  • 其实,我做到了!就是这样! yield 语句后的“ANYTHING”永远不会运行!
  • 你已经可以访问SomeBool,你不能看看吗?
  • @Immersive 因为...如果SomeBoolfalseisRunningtrue,如果你现在停止协程,'isRunning` 仍然是true 而协程已经停止了!错误的!而如果SomeBooltrue,那么协程就结束了,但是SomeBool还是true,错了!让我看看如何改写我的问题。
  • @Servy 问题是否已更新到足够清晰?我觉得现在说得通了。

标签: c# unity3d coroutine


【解决方案1】:

使用CustomYieldInstruction.keepWaiting。使yield return 的对象在协程之外可用,并且可以检查协程是否会等待,如果它现在被检查:

public class TestScript : MonoBehaviour
{
    CustomYieldInstruction waitTest;
    Coroutine waitingCoroutine;
    bool waitBool;

    void Start()
    {
        waitBool = false;
        waitingCoroutine = StartCoroutine(WaitingCoroutine());
        StartCoroutine(TriggeringCoroutine());
    }

    private IEnumerator WaitingCoroutine()
    {
        waitTest = null;
        yield return null;

        waitTest = new WaitUntil(() => waitBool);
        yield return waitTest;

        waitTest = new WaitUntil(() => waitBool);
        yield return waitTest;

        waitingCoroutine = null;
    }
 
    private IEnumerator TriggeringCoroutine()
    {
        Debug.Log(string.Format("First frame waiting: {0}", IsWaiting())); // false
        yield return null;

        Debug.Log(string.Format("Second frame waiting: {0}", IsWaiting())); // true
        yield return null;

        waitBool = true;
        Debug.Log(string.Format("Third frame waiting: {0}", IsWaiting())); // false
        yield return null;

        Debug.Log(string.Format("Fourth frame waiting: {0}", IsWaiting())); // false
        yield return null;

        Debug.Log(string.Format("Fifth frame waiting: {0}", IsWaiting())); // false

    }

    private bool IsWaiting()
    {
        return waitingCoroutine != null && waitTest != null && waitTest.keepWaiting;
    }
}

【讨论】:

  • 感谢您的回答!但这超出了我的能力范围,请您这么好心并为我解释一下好吗?非常感谢!
  • 您需要做的一切都在IsWaitingWaitingCoroutine 中。除非您提出具体问题,否则我不确定我还能添加什么。
猜你喜欢
  • 2022-10-11
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 2023-04-11
  • 1970-01-01
  • 2010-11-02
相关资源
最近更新 更多