我有一个启动协同程序的方法,应该在再次启动之前停止它并重置一些东西。
private Coroutine wholeTutorialRoutine;
public void RunWholeTutorial()
{
tutorialText.text = "";
StopAllCoroutines();
if(wholeTutorialRoutine != null)
{
StopCoroutine(wholeTutorialRoutine);
}
wholeTutorialRoutine = StartCoroutine(WholeTutorial());
}
private IEnumerator WholeTutorial()
{
// Wait until after we are done showing this dialouge
yield return StartCoroutine(ShowDialougForSeconds("tap_to_kill", 5f));
yield return new WaitForSeconds(5f);
yield return StartCoroutine(ShowDialougForSeconds("larger_enemies", 5f));
yield return new WaitForSeconds(5f);
yield return StartCoroutine(ShowDialougForSeconds("press_button", 7f));
yield return new WaitForSeconds(3f);
yield return StartCoroutine(ShowDialougForSeconds("button_colors", 5f));
}
private IEnumerator ShowDialougForSeconds(string diagID, float time)
{
SetText(diagID);
tutorialText.GetComponent<Animator>().SetTrigger("FadeIn");
yield return new WaitForSeconds(time);
tutorialText.GetComponent<Animator>().SetTrigger("FadeOut");
}
wholeTutorialRoutine
是Coroutine
类型的私有字段。
我觉得那些WaitForSeconds
电话会发生一些时髦的事情,但我不太确定是什么。
RunWholeTutorial()
连接到一个按钮,所以我想停止当前教程,如果用户一遍又一遍地按下它,则重新开始。
目前发生的事情似乎是协同程序在彼此之上运行。
答案 0 :(得分:2)
使用class MyScrollListener() : RecyclerView.OnScrollListener() {
var currentScrollPosition = 0
override fun onScrolled(view: RecyclerView, dx: Int, dy: Int) {
currentScrollPosition += dy
if( currentScrollPosition == 0 ) {
// We're at the top
}
}
}
代替IEnumerator
在Coroutine
函数中存储RunWholeTutorial
协程函数一次的实例。然后,您可以使用Start
变量启动和停止它。
IEnumerator