[英]Ending a coroutine while running in unity3d
我试图用按钮启动和结束协程。 我可以启动协程,但是无法停止,如果在第一次启动协程后再次单击该按钮,它将再次重新启动,并且滑块值会上升。
这是我的代码
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());
}
你需要调用StopCoroutine
用相同的参考Coroutine
由归国StartCoroutine
,就像这样:
private Coroutine loopCoroutine;
public void LoopButton()
{
if (lb == 1)
{
StopCoroutine(loopCoroutine);
tb--;
}
else
{
loopCoroutine = StartCoroutine(AutoLoop());
tb++;
}
}
若要使用此方法,请将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);
}
}
}
对于另一个解决方案,正如另一个用户所评论的,也可以通过布尔标志来停止协程:
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());
}
}
但是,使用Unity的StopCoroutine
优于使用boolean标志来提高可读性和整洁度。
您可以使用StopCoroutine
。
此处提供更多信息: https : //docs.unity3d.com/ScriptReference/MonoBehaviour.StopCoroutine.html
使用字符串作为协程名称。 像这样:
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");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.