我目前正在从事Unity的游戏,我有一个小问题。我试图创建一个效果,其中Ingame分数计数器的颜色在分数计数器递增时暂时更改颜色,然后切换回其原始颜色。但是,当我尝试这样做时,我的游戏不断崩溃。我正在使用一段时间的循环来完成此任务,但是一旦我尝试在游戏中触发此事件,我的游戏和Unity Crash都会触发。有人知道为什么会发生这种情况,并且可能有解决方案以解决这个问题?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StarCollision : MonoBehaviour
{
private void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "White Ball" )
{
gameObject.SetActive(false);
ScoreScript.scoreValue += 1;
while (Time.deltaTime < 0.2f)
{
ScoreScript.score.color = Color.yellow;
}
ScoreScript.score.color = Color.white;
}
}
}
使用coroutines及其waitforseconds方法
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StarCollision : MonoBehaviour
{
private void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.CompareTag("White Ball"))
{
ScoreScript.scoreValue += 1;
StartCoroutine(ChangeColor());
}
}
private IEnumerator ChangeColor ()
{
ScoreScript.score.color = Color.yellow;
yield return new WaitForSeconds(0.2f);
ScoreScript.score.color = Color.white;
gameObject.SetActive(false);
}
}
您的while
循环阻止主/UI线程=>执行,并且仅在完成后才呈现下一个帧!
此外, Time.deltaTime
是自上次帧呈现以来的时间...因此,它可能永远不会到达0.2
,因为假设您在60 fps
上运行,则该值将大约 0.017
=> unity冻结!
您应该使用Coroutine:
public class StarCollision : MonoBehaviour
{
private void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "White Ball" )
{
ScoreScript.scoreValue += 1;
// start the routine
StartCoroutine(ChangeColor());
gameObject.SetActive(false);
}
}
private IEnumerator ChangeColor()
{
ScoreScript.score.color = Color.yellow;
// yield says: return to main thread, renderer the frame
// and continue from here in the next frame
// WaitForseconds .. does exactly this
yield return new WaitForseconds(0.2f);
ScoreScript.score.color = Color.white;
}
}
我会在Coroutine完成之前离开您的gameObject.SetActive(false);
,但是之后它开始了,因为您立即想要它,并且
注意:当禁用
MonoBehaviour
时,只有当它肯定被销毁时,就不会停止Coroutines。您可以使用MonoBehaviour.StopCoroutine
和MonoBehaviour.StopAllCoroutines
停止Coroutine。当MonoBehaviour
被销毁时,也会停止Coroutines。
您必须使用Coroutine
。查看https://docs.unity3d.com/manual/coroutines.html
基本上,您只需在循环的每次迭代,所需的时间上产生一个框架,或者在特定的时间内产生。
希望它能帮助