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()); } }