Unity 中协程内的 while 循环

Sai*_*aif 2 c# unity-game-engine

我有两个脚本。第一个脚本在开始时被调用,如下所示:Script1.cs

private Script2 script2;

void Start () {
        script2= (Script2) GameObject.FindObjectOfType (typeof (Script2));
        StartCoroutine("CallTrigger");
    }

IEnumerator CallTrigger() {
        while(script2.hasTriggered == true){
         Debug.Log("Success");
         script2.hasTriggered = false;
        }
    yield return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的脚本2如下:

public bool hasTriggered = false;
Run Code Online (Sandbox Code Playgroud)

由于我的第一个脚本首先被调用,所以我希望 CallTrigger() 函数等待,直到 script2 中的 bool 设置为 true。不幸的是, while() 不是我认为的正确方法,因为它不适合我。我知道最好的方法是使用 Update() 但我正在使用此脚本的多个实例,其中只有一些实例在开始时被调用。

那么如何让 CallTrigger 等待,直到 script2 中的 hasTriggered 设置为 true 为止?

der*_*ugo 6

我希望 CallTrigger() 函数等待,直到 script2 中的 bool 设置为 true

你可以简单地使用WaitUntil

IEnumerator CallTrigger() 
{
    yield return new WaitUntil(() => script2.hasTriggered);

    Debug.Log("Success");
}
Run Code Online (Sandbox Code Playgroud)

这基本上等于做类似的事情

IEnumerator CallTrigger() 
{
    // As long as the flag is NOT set
    while(!script2.hasTriggered)
    {
        // wait a frame
        yield return null;
    }

    Debug.Log("Success");
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你也可以直接制作它

// Yes, if Start returns IEnumerator Unity automatcally runs it as a coroutine
IEnumerator Start()
{
    // Rather use the generic versions
    script2 = GameObject.FindObjectOfType<Script2>();

    yield return new WaitUntil(()=> script2.hasTriggered);

    Debug.Log("Success");
}
Run Code Online (Sandbox Code Playgroud)