在C#和Unity中更改特定时间的文本颜色



我目前正在从事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.StopCoroutineMonoBehaviour.StopAllCoroutines停止Coroutine。当MonoBehaviour被销毁时,也会停止Coroutines。

您必须使用Coroutine。查看https://docs.unity3d.com/manual/coroutines.html

基本上,您只需在循环的每次迭代,所需的时间上产生一个框架,或者在特定的时间内产生。

希望它能帮助

相关内容

  • 没有找到相关文章

最新更新