Bos*_*c95 2 c# loops coroutine unity-game-engine
我试图用一个按钮开始和结束一个协程。我可以启动协程,但我不能停止它,如果我在第一次启动协程后再次单击该按钮,它只会再次重新启动并且滑块值上升。
继承人我的代码
public void LoopButton(){
if (lb == 1){
StopCoroutine (AutoLoop());
tb--;
} else {
StartCoroutine (AutoLoop ());
tb++;
}
}
IEnumerator AutoLoop(){
slider.value = slider.minValue;
while(slider.value < slider.maxValue){
slider.value++;
yield return new WaitForSeconds(0.5f);
}
StartCoroutine (AutoLoop());
}
Run Code Online (Sandbox Code Playgroud)
您需要StopCoroutine使用对返回的相同 的引用进行调用,如下所示:CoroutineStartCoroutine
private Coroutine loopCoroutine;
public void LoopButton()
{
if (lb == 1)
{
StopCoroutine(loopCoroutine);
tb--;
}
else
{
loopCoroutine = StartCoroutine(AutoLoop());
tb++;
}
}
Run Code Online (Sandbox Code Playgroud)
要使用此方法,请将您的AutoLoop方法更改为使用 while 循环,而不是AutoLoop在方法结束时启动另一个协程。否则,您将无法停止在AutoLoop.
IEnumerator AutoLoop()
{
while(true)
{
slider.value = slider.minValue;
while (slider.value < slider.maxValue)
{
slider.value++;
yield return new WaitForSeconds(0.5f);
}
}
}
Run Code Online (Sandbox Code Playgroud)
对于替代解决方案,正如另一位用户所评论的,也可以通过布尔标志停止协程:
private bool stopLoop;
public void LoopButton()
{
if (lb == 1)
{
stopLoop = true;
tb--;
}
else
{
stopLoop = false;
StartCoroutine (AutoLoop ());
tb++;
}
}
IEnumerator AutoLoop()
{
slider.value = slider.minValue;
while (slider.value < slider.maxValue && !stopLoop)
{
slider.value++;
yield return new WaitForSeconds(0.5f);
}
if (!stopLoop)
{
StartCoroutine(AutoLoop());
}
}
Run Code Online (Sandbox Code Playgroud)
但是,StopCoroutine为了可读性和清洁度,使用 Unity比使用布尔标志更可取。
| 归档时间: |
|
| 查看次数: |
1128 次 |
| 最近记录: |