我目前正在Unity中开展游戏,我遇到了一个小问题。我正在尝试创建一种效果,当分数计数器增加时,游戏分数计数器的颜色会暂时改变颜色,然后切换回原始颜色。然而,当我尝试这样做时,我的游戏一直在崩溃。我正在使用while循环来执行此任务,但是一旦我尝试在游戏中触发此事件我的游戏以及Unity崩溃。有谁知道为什么会发生这种情况,并且可能有解决方案来解决这个问题?
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);
但是在它开始之后你就立刻想要它了
注意:当禁用Coroutines时,
MonoBehaviour
不会停止,但只有当它被明确销毁时才会停止。你可以使用MonoBehaviour.StopCoroutine
和MonoBehaviour.StopAllCoroutines
来停止Coroutine。当MonoBehaviour
被摧毁时,协同程序也被停止。
你必须使用Coroutine
for。看看https://docs.unity3d.com/Manual/Coroutines.html
基本上,您只需在循环的每次迭代中产生一个帧,即您想要的时间量,或者您在特定时间内产生的时间。
希望它有所帮助