所以我在使用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 -...
SitIdle()
的返回值是IEnumerator
。 IEnumerator
一旦完成就不会重复并且没有迭代,这就是StartCoroutine
告诉Unity要做的事情。每当协程从yield
恢复时,Unity都会告诉协程执行另一个迭代。