使用Coroutine计算对象

时间:2017-01-26 16:11:22

标签: c# unity3d unity5

在我的项目中我试图计算不同的对象并模拟一个小动画,例如我在我的游戏中有星星,我想要计算游戏最后一个星星的数量从0到星星的数量用户得到了,所以我这样做了:

public void youWin()
    {
        audio.Stop ();
        StartCoroutine (activatePanel ());
    }

    IEnumerator activatePanel()
    {
        yield return new WaitForSeconds (3f);
        pausePanel2.SetActive (true);
        for (int i = 0; i <= stars; i++) {
            yield return new WaitForSeconds (0.2f);
            starText2.text = i + "";
        }
    }

我的代码在for循环上等待几秒钟的0.3f效果很好,但它太慢了,我希望它为0.2f,但有时会发生一些奇怪的事情它会变成一个bug并且第一个数字似乎又回来了,它不算数,有人知道发生了什么事吗?

2 个答案:

答案 0 :(得分:1)

activatePanel函数很可能在其已经运行时从另一个地方调用,或者包含此代码的脚本附加到多个GameObjects,而activatePanel再次被调用另一个功能。您可以使用flag来阻止这种情况发生。

如果协同程序功能已经运行,请使用yield break;打破它。

bool isRunning = false;
IEnumerator activatePanel()
{
    //Exit if already running
    if (isRunning)
    {
        yield break;
    }

    //Not running, now set isRunning to true then run
    isRunning = true;

    yield return new WaitForSeconds(3f);
    pausePanel2.SetActive(true);

    WaitForSeconds waitTime = new WaitForSeconds(0.2f);
    for (int i = 0; i <= stars; i++)
    {
        yield return waitTime;
        starText2.text = i.ToString();
    }

    //Done running, set isRunning to false
    isRunning = false;
}

答案 1 :(得分:0)

嗯,我和你们所有人一起解决了这个问题,实际上你们所有的地方都是正确的,我认为我只是一次调用youWin函数,但我忘记了这是统一而我在trigerEnter函数中调用了youWin,这意味着对象保持进入triger函数并调用youWin函数,谢谢大家这就是我的意思

用bool输入

解决了这个问题
public class Victory : MonoBehaviour {

Manager gameManager;
// Use this for initialization
public AudioClip clip;
private AudioSource audio;
public Animator girl;
private bool entered;


void OnTriggerEnter(Collider c)
{
    if (c.gameObject.tag == "Player" && !entered) {
        gameManager.win = true;
        audio.clip = clip;
        audio.Play ();
        gameManager.Ball.GetComponent<MoveBall> ().enabled = true;
        girl.SetBool ("win",true);
        entered = true;
        gameManager.youWin ();
    }
}

void Start () {
    gameManager = GameObject.Find ("GameController").GetComponent<Manager> ();
    audio = GetComponent<AudioSource> ();
    entered = false;

}

// Update is called once per frame
void Update () {

}
}