Использование сопрограмм для постепенного увеличения / уменьшения TextMeshPro Text Element - PullRequest
0 голосов
/ 08 мая 2019

Я устанавливаю «вступление к сцене» с текстом «Уровень 1», используя TextMeshPro. Я создал текстовый элемент на холсте, и я пытаюсь найти способ заставить его исчезать, затем ждать и затем исчезать (что-то вроде того, что вы видите, когда открываете новое место в Скайриме).

Пока что я попробовал универсальное решение, чтобы я мог использовать тот же сценарий для других целей (например, не в начале сцены, не только в появлении и т. Д.).

Использование TMPro:

...
using TMPro;
...

Начало и объявление:

public class IntroFade : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI textToUse;
    [SerializeField] private bool fadeIn = false;
    [SerializeField] private bool fadeOnStart = false;
    [SerializeField] private float timeMultiplier;
    private bool FadeIncomplete = false;

    private void Start()
    {

        if (fadeOnStart)
        {
            if (fadeIn)
            {
                StartCoroutine(FadeInText(timeMultiplier, textToUse));
                FadeIncomplete = true;
            }
            else
            {

                StartCoroutine(FadeOutText(timeMultiplier, textToUse));
            }
        }
    }
...

Обновление, в котором я хочу постепенно исчезнуть, как только fadein завершено


    private void Update()
    {
        if (FadeIncomplete)
        {
            StartCoroutine(FadeOutText(timeMultiplier, textToUse));
        }
    }


Corouritnes для фактического замирания:


private IEnumerator FadeInText(float timeSpeed, TextMeshProUGUI text)
    {
        text.color = new Color(text.color.r, text.color.g, text.color.b, 0);
        while (text.color.a < 1.0f)
        {
            text.color = new Color(text.color.r, text.color.g, text.color.b, text.color.a + (Time.deltaTime * timeSpeed));
            yield return null;
        }
    }
    private IEnumerator FadeOutText(float timeSpeed, TextMeshProUGUI text)
    {
        text.color = new Color(text.color.r, text.color.g, text.color.b, 1);
        while (text.color.a > 0.0f)
        {
            text.color = new Color(text.color.r, text.color.g, text.color.b, text.color.a - (Time.deltaTime * timeSpeed));
            yield return null;
        }
    }
    public void FadeInText(float timeSpeed = -1.0f)
    {
        if (timeSpeed <= 0.0f)
        {
            timeSpeed = timeMultiplier;
        }
        StartCoroutine(FadeInText(timeSpeed, textToUse));
    }
    public void FadeOutText(float timeSpeed = -1.0f)
    {
        if (timeSpeed <= 0.0f)
        {
            timeSpeed = timeMultiplier;
        }
        StartCoroutine(FadeOutText(timeSpeed, textToUse));
    }

Так что же происходит, когда он либо исчезает, либо исчезает в зависимости от того, какая программа запускается первой. Я не могу сделать так, чтобы он исчезал, оставался на экране в течение примерно 2 секунд, а затем исчезал.

Я также попытался зайти в затем, создав сопрограмму для ожидания в течение нескольких секунд, а затем вызвал сопрограмму исчезновения, но это тоже не сработало.

1 Ответ

1 голос
/ 08 мая 2019

Сопрограмма может дождаться завершения другой сопрограммы, думая об этом таким образом, значительно упростит проблему. Вы уже создали свои исчезновения и затухания, теперь вам просто нужно запустить их последовательно с интервалом в 2 секунды между ними.

private IEnumerator IntroFade (TextMeshProUGUI textToUse) {
   yield return StartCoroutine(FadeInText(1f, textToUse));
   yield return new WaitForSeconds(2f);
   yield return StartCoroutine(FadeOutText(1f, textToUse));
   //End of transition, do some extra stuff!!
}

Если вам интересно, эти статьи довольно проницательны, когда нужно больше узнать о сопрограммах.

...