【问题标题】:Using coroutines to fade in/out TextMeshPro Text Element使用协程淡入/淡出 TextMeshPro 文本元素
【发布时间】:2019-09-25 14:47:30
【问题描述】:

我正在使用 TextMeshPro 设置一个“场景介绍”,其中包含一些文字“级别 1”。我已经在画布中创建了文本元素,我正试图找到一种方法让它淡入,然后等待,然后淡出(有点像你在天际中发现一个新地方时看到的那样)。

到目前为止,我尝试了一种通用的解决方案,因此我可以将相同的脚本用于其他用途(例如,不在场景开始时,而不仅仅是淡入等)。

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

在淡入完成后我想要淡出的更新


    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 秒钟然后淡出。

我也尝试过淡入,然后创建一个协程等待秒,然后调用淡出协程,但这也不起作用。

【问题讨论】:

  • 协程很好,但可能有点矫枉过正。你试过动画吗? (您可以在 Unity 中为几乎任何东西制作动画)

标签: c# unity3d coroutine ienumerator


【解决方案1】:

一个协程可以等待另一个协程完成,这样想会大大简化问题。您已经创建了淡入和淡出,现在您只需按顺序运行它们,并在它们之间等待 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!!
}

如果您有兴趣,these articles 在了解更多有关协程方面非常有见地。

【讨论】:

  • 这里你甚至不需要StartCoroutine() 部分。 yield return FadeOutText(1f, textToUse); 可以正常工作。
  • 您的解决方案绝对有效。我不知道我怎么看不到它。而且这些文章很有帮助。谢谢。
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 2014-03-19
  • 2013-07-20
  • 2017-06-10
  • 1970-01-01
  • 2015-08-08
  • 2011-07-04
  • 1970-01-01
相关资源
最近更新 更多