当将IEnumerator作为变量传递时,Unity'StartCoroutine'不会运行两次?

问题描述 投票:0回答:1

所以我在使用Unity中的co-routine来模拟NPC时遇到了奇怪的事情(朝目标走去,闲置了x秒,走到了目标--repeat- -)。

[我发现使用包含IEnumerator的变量启动协例程不会运行两次,而使用直接传入的方法启动协例会按预期的方式运行,可重复。

为什么这样工作?“幕后”发生了什么?我无法解决这个问题,这让我很烦。

在我的IEnumerator

方法下面,它模拟空闲时间。
private IEnumerator sitIdle()
{
    var timeToWait = GetIdleTime();
    _isIdle = true;
    yield return new WaitForSeconds(timeToWait);
    _isIdle = false;
} 

如果根据场景1(下面)第二次调用此方法,则多次调用它会按预期运行。只是一遍又一遍地重复该过程。

但是,如果根据场景2(在下面)将其作为变量调用,它将启动一次,但拒绝再次输入,仅在代码中简单地“跳过”它。

void LateUpdate()
    {
        _idleRoutine = sitIdle; //this is not actually in the late update, just moved here for reference.

        if (_agent.hasPath)
        {
            if (isTouchingTarget())
            {
                StartCoroutine(sitIdle2()); //Scenario #1

                StartCoroutine(_idleRoutine); //Scenario #2

                _currentTarget = null; 
                _agent.ResetPath();
            }
        }

Tl; dr:StartCoroutine(可变为IEnumerator)是不可重复的,而StartCoroutine(IEnumerator())可以正常工作,为什么我不能将IEnumerator作为变量传递?

因此,当我在Unity中使用协同例程模拟NPC时(遇到一个目标,空了x秒,走到一个目标--repeat--),我遇到了一些奇怪的事情。我发现启动co -...

c# unity3d coroutine
1个回答
1
投票

SitIdle()的返回值是IEnumeratorIEnumerator一旦完成就不会重复并且没有迭代,这就是StartCoroutine告诉Unity要做的事情。每当协程从yield恢复时,Unity都会告诉协程执行另一个迭代。

© www.soinside.com 2019 - 2024. All rights reserved.