【问题标题】:Is there a reason why only one coroutine works in my code? [duplicate]为什么我的代码中只有一个协程可以工作,这是有原因的吗? [复制]
【发布时间】:2020-03-21 04:45:55
【问题描述】:

我有一个敌人目前一直在攻击,攻击之间没有停止。我想让敌人在再次攻击之前等待一段时间,以模拟敌人“休息”并让玩家有机会在不攻击的情况下攻击他。我需要协程来完成我的动画播放,这样它就可以在等待时进入空闲动画:

IEnumerator Attacking()
    {
        yield return new WaitForSeconds(animLenght);
        isAttacking = false;
    }

我已经制作了另一个协程等待一秒钟,然后再次启用攻击,但它不起作用。敌人攻击不刹车,比如协程不起作用:

IEnumerator WaitForAttack()
    {
        yield return new WaitForSeconds(1);
    }

我已将 WaitForAttack() 协程放入我的攻击函数中:

private void Attack()
    {
        StartCoroutine(WaitForAttack());
        isAttacking = true;
        StartCoroutine(Attacking());
    }

我想知道我在协程方面做错了什么,因为我刚刚开始使用协程,这个问题困扰了我很长时间。

【问题讨论】:

  • WaitForAttack 实际上什么都不做。只有一个 return 语句,所以如果你删除 Attack 中的调用,你就会明白为什么你的代码没有按照你期望的方式工作。
  • 我明白了。谢谢。

标签: c# unity3d


【解决方案1】:

MonoBehaviour.StartCoroutine 的文档说

StartCoroutine 函数总是立即返回

所以Attack方法在调用StartCoroutine(WaitForAttack());后不会等待,立即设置isAttacking = true;。相反,在协程本身中设置isAttacking。还要在同一个协程中执行这两项操作,以确保操作按顺序执行。否则两个协程将同时并行运行。

IEnumerator WaitAndAttack()
{
    yield return new WaitForSeconds(1);
    isAttacking = true;
    yield return new WaitForSeconds(animLenght);
    isAttacking = false;
}

private void Attack()
{
    StartCoroutine(WaitAndAttack());
}

【讨论】:

  • 谢谢。我不相信事情就这么简单。需要投入更多时间阅读正确的文档。终于解决了这个问题感觉很好。感谢您的宝贵时间。
  • 我很高兴为您提供帮助,也很高兴它能正常工作,因为我从未编写过 Unity。
【解决方案2】:

协程只能挂起自己(yield return ____),而不能挂起调用它们的方法或对象。它们与同步方法不同。当调用协程并返回父方法时,该父方法将在同一帧中继续。

在您的方法中,您从同一帧上的同一方法调用“WaitForAttack()”和“Attacking()”。 “WaitForAttack()”字面上什么都不做。

这里是一个协程的例子,它运行 5 次,在它被调用后每秒运行一次。请注意,var waitForSeconds 被初始化一次,而不是每次我将控制权交还给主线程时。这是一个小的优化,但被认为是最佳实践。

class TimedCoroutine : MonoBehaviour
{
    var waitForSeconds = new WaitForSeconds(1);
    IEnumerator CountdownToAction()
    {
        int countdown = 5;
        while(countdown >= 0)
        {
            print(countdown--);
            yield return waitForSeconds;
        }
        //Perform action here
    }
}

【讨论】:

  • 感谢您,我现在对协程有了更多的了解。我绝对可以使用此代码和知识。感谢您的宝贵时间。
猜你喜欢
  • 2021-11-18
  • 2017-03-13
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
相关资源
最近更新 更多