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

问题描述 投票:1回答:3

我目前正在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;


            }

        }
    }
c# unity3d game-development
3个回答
3
投票

使用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);
    }
}

3
投票

你的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.StopCoroutineMonoBehaviour.StopAllCoroutines来停止Coroutine。当MonoBehaviour被摧毁时,协同程序也被停止。


-2
投票

你必须使用Coroutinefor。看看https://docs.unity3d.com/Manual/Coroutines.html

基本上,您只需在循环的每次迭代中产生一个帧,即您想要的时间量,或者您在特定时间内产生的时间。

希望它有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.