Unity协程无法按预期工作
Unity coroutine not work as expected
你好朋友<我在使用统一协程时遇到了困难。假设我启动了一个协程。当我停止时,是否应该执行 yield 下面的代码?我认为不。
我错了吗?这是我的代码
[PunRPC]
public void timerstart(){
StopCoroutine(time ());
currentplayerbar.fillAmount=1.0f;
currentplayerbar=timebar[turn-1];
StartCoroutine(time());
Debug.Log("time started");
}
IEnumerator time(){
Debug.Log("start coroutine");
timer=60;
timerisruning=true;
yield return new WaitForSeconds(60);
Debug.Log("60 sec passed");
timerisruning=false;
if(id==turn){
if (passnumber==3){
//StartCoroutine (noplayeractivity ());
}
else {
passnumber++;
turn+=1;
Hashtable turnbupdate=new Hashtable (){{"turn",turn},{"pass",passnumber}};
PhotonNetwork.room.SetCustomProperties(turnbupdate);
photonView.RPC("timerstart",PhotonTargets.All);
PhotonNetwork.SendOutgoingCommands();
}
}
}
在调试器中我看到四个调试日志Debug.Log("60 sec passed");没有任何
Debug.Log("start coroutine");之间。我认为它们是并行运行的,但为什么呢?我在开始新协程之前停止了协程
当您调用 StopCoroutine(time ());
时,您并没有停止之前启动的协程。您正在创建一个新协程,但没有在同一行中启动和结束它。
您可以通过两种方式修复它:
不是通过引用而是通过反射调用它们 - 简单地说,将调用更改为:
StopCoroutine("time");
...
StartCoroutine("time");
将 运行 协程存储在变量中
var coroutine:IEnumerator;
[PunRPC]
public void timerstart(){
if(coroutine != null)
StopCoroutine(coroutine);
...
coroutine=time();
StartCoroutine(coroutine);
}
你好朋友<我在使用统一协程时遇到了困难。假设我启动了一个协程。当我停止时,是否应该执行 yield 下面的代码?我认为不。 我错了吗?这是我的代码
[PunRPC]
public void timerstart(){
StopCoroutine(time ());
currentplayerbar.fillAmount=1.0f;
currentplayerbar=timebar[turn-1];
StartCoroutine(time());
Debug.Log("time started");
}
IEnumerator time(){
Debug.Log("start coroutine");
timer=60;
timerisruning=true;
yield return new WaitForSeconds(60);
Debug.Log("60 sec passed");
timerisruning=false;
if(id==turn){
if (passnumber==3){
//StartCoroutine (noplayeractivity ());
}
else {
passnumber++;
turn+=1;
Hashtable turnbupdate=new Hashtable (){{"turn",turn},{"pass",passnumber}};
PhotonNetwork.room.SetCustomProperties(turnbupdate);
photonView.RPC("timerstart",PhotonTargets.All);
PhotonNetwork.SendOutgoingCommands();
}
}
}
在调试器中我看到四个调试日志Debug.Log("60 sec passed");没有任何 Debug.Log("start coroutine");之间。我认为它们是并行运行的,但为什么呢?我在开始新协程之前停止了协程
当您调用 StopCoroutine(time ());
时,您并没有停止之前启动的协程。您正在创建一个新协程,但没有在同一行中启动和结束它。
您可以通过两种方式修复它:
不是通过引用而是通过反射调用它们 - 简单地说,将调用更改为:
StopCoroutine("time"); ... StartCoroutine("time");
将 运行 协程存储在变量中
var coroutine:IEnumerator; [PunRPC] public void timerstart(){ if(coroutine != null) StopCoroutine(coroutine); ... coroutine=time(); StartCoroutine(coroutine); }