StartCoroutine被调用了很多次(C#Unity)

我正在Unity中创建一个弹出菜单选项。 现在我的问题是我在无效更新中做的协程被调用了很多次。 我的意思是在我的Unity控制台上,Debug.Logs正在递增。 它应该是正确的,因为它已经是协程。 有些人可以帮助我理解更多的协程并帮助我解决我的小问题。

这是我的代码:

[SerializeField] GameObject Option; [SerializeField] Button btn,btn2; [SerializeField] GameObject open, close; [SerializeField] GameObject[] opt; bool startFinding = false; void Start() { Option.SetActive(false); Button popUp = btn.GetComponent

协同程序的工作原理如下:

假设我有一个名为MyRoutine的couroutine函数(在您的情况下,您称之为GameOptions)

 private IEnumerator MyRoutine() 

然后,在我的代码中的任何地方,调用

 StartCoroutine(MyRoutine)); 

就像任何常用方法一样简单地调用MyRoutine 。 因此,如果你在更新中调用它,它将一直被调用,就像任何方法一样。 这不是你想要的。 协同程序的特殊之处在于您可以在其中使用yield关键字。 有很多种方法可以使用它,但最常用(和简单)的方法是yield return null

yield return null表示“停止此协程,但在下一帧上恢复执行”。 您不需要调用任何其他函数(当然不是StartCoroutine)。 执行将在下一帧恢复。

要回到您在问题中发布的内容,您在结尾处写了yield return null 。 所以你的方法正在执行,并且最后,停止并恢复下一帧,但由于没有什么可做,它会在下一帧退出。

使用协同程序的一种典型方法是在while循环中使yield return null ,因此当它恢复时,它会继续循环。 这是一个做它的例子

 private IEnumerator MyRoutine() { while(running) //running is a member bool that you could set to false to exit { // Do all the stuff you want to do in ONE frame // ... yield return null; } } 

通常,StartCoroutine将在Start()函数中调用,或者稍后在触发事件时调用。

如果您想了解更多关于协同程序的信息,或者检查您是否正确理解它们,请查看此页面: https : //docs.unity3d.com/Manual/Coroutines.html

或者这个videohttps://unity3d.com/learn/tutorials/topics/scripting/coroutines

//编辑:快速提供一个有用的选项

在上面的代码片段中,while循环与Update函数非常相似(每帧执行循环内部)。 一个不错的选择是替换

 yield return null 

通过

 yield return new WaitForSeconds(waitTime) 

waitTime是您在恢复之前要等待的时间,以秒为单位

//编辑结束

不要在Update方法中使用StartCoroutine() 。 如果需要,在另一个方法中调用它并在coroutine函数中使用while loop 。 只需在Update方法之外控制StartCoroutine()

每帧调用更新,如果你的条件是真的,你每帧都会启动你的协程。 只需将你的旗帜设置为加入1次即可。

 void Update() { if (startFinding) { startFinding = false; StartCoroutine(GameOptions()); } }