Изменение цвета текста на определенное количество времени в C # и Unity - PullRequest
0 голосов
/ 04 марта 2019

Я сейчас работаю над игрой в 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;


            }

        }
    }

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Использовать сопрограммы и метод 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);
    }
}
0 голосов
/ 04 марта 2019

Ваш цикл while блокирует поток Main / 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;
    }
}

Я бы оставил ваш gameObject.SetActive(false); до того, как Coroutine закончил, но после он начался, так как вы этого хотитенемедленно и

Примечание: Сопрограммы не останавливаются, когда MonoBehaviour отключен, а только когда он определенно уничтожен.Вы можете остановить сопрограмму, используя MonoBehaviour.StopCoroutine и MonoBehaviour.StopAllCoroutines.Сопрограммы также останавливаются при уничтожении MonoBehaviour.

0 голосов
/ 04 марта 2019

Вы должны использовать Coroutine для этого.Проверьте https://docs.unity3d.com/Manual/Coroutines.html

По сути, вы просто получаете один кадр на каждой итерации цикла в течение требуемого периода времени или отдаете определенное количество времени.

Надеюсьпомог

...