【发布时间】: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