在我的项目中我试图计算不同的对象并模拟一个小动画,例如我在我的游戏中有星星,我想要计算游戏最后一个星星的数量从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并且第一个数字似乎又回来了,它不算数,有人知道发生了什么事吗?
答案 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 () {
}
}