随着时间的推移淡化 Sprite 几乎与 moving 游戏对象相同,只是您修改了它的 alpha 而不是它的位置。
关于淡化对象的三个最重要的东西是Time.deltaTime、Mathf.Lerp/Color.Lerp 和协程。您需要了解它们是如何协同工作的。
启动协程,使用Time.deltaTime 增加一个变量。该变量用于确定该函数运行了多少。在for/while 循环中,使用每帧递增的变量以及您希望淡入淡出发生的持续时间在Mathf.Lerp 函数的帮助下生成alpha。使用该 alpha 创建新颜色并将其分配给 Sprite。
每帧都会执行此操作,直到以Time.deltaTime 递增的变量达到您希望淡入淡出发生的持续时间。
这是一个简单的SpriteRenderer淡入淡出函数:
public SpriteRenderer spriteToFade;
IEnumerator fadeOut(SpriteRenderer MyRenderer, float duration)
{
float counter = 0;
//Get current color
Color spriteColor = MyRenderer.material.color;
while (counter < duration)
{
counter += Time.deltaTime;
//Fade from 1 to 0
float alpha = Mathf.Lerp(1, 0, counter / duration);
Debug.Log(alpha);
//Change alpha only
MyRenderer.color = new Color(spriteColor.r, spriteColor.g, spriteColor.b, alpha);
//Wait for a frame
yield return null;
}
}
如果您希望它淡入,请将 Mathf.Lerp(1, 0, counter / duration); 更改为 Mathf.Lerp(0, 1, counter / duration);,这将使 alpha 随时间从 0 变为 1,而不是 1 变为 0。
从上面的示例中,编写淡出和淡入函数只需要一种方法来告诉函数将 alpha 从1 更改为0 或从0 更改为1。您可以使函数使用boolean 或enum 变量来确定要执行哪种类型的淡入淡出。当然,您可以将淡入/淡出功能分开,但最好将其放在一个功能中。
这是该功能的扩展版本,支持淡入淡出。它还支持几乎所有的游戏对象,如MeshRenderer(3D)、SpriteRenderer(2D)、Image、RawImage....您可以扩展它以支持更多缺少的组件。
IEnumerator fadeInAndOut(GameObject objectToFade, bool fadeIn, float duration)
{
float counter = 0f;
//Set Values depending on if fadeIn or fadeOut
float a, b;
if (fadeIn)
{
a = 0;
b = 1;
}
else
{
a = 1;
b = 0;
}
int mode = 0;
Color currentColor = Color.clear;
SpriteRenderer tempSPRenderer = objectToFade.GetComponent<SpriteRenderer>();
Image tempImage = objectToFade.GetComponent<Image>();
RawImage tempRawImage = objectToFade.GetComponent<RawImage>();
MeshRenderer tempRenderer = objectToFade.GetComponent<MeshRenderer>();
Text tempText = objectToFade.GetComponent<Text>();
//Check if this is a Sprite
if (tempSPRenderer != null)
{
currentColor = tempSPRenderer.color;
mode = 0;
}
//Check if Image
else if (tempImage != null)
{
currentColor = tempImage.color;
mode = 1;
}
//Check if RawImage
else if (tempRawImage != null)
{
currentColor = tempRawImage.color;
mode = 2;
}
//Check if Text
else if (tempText != null)
{
currentColor = tempText.color;
mode = 3;
}
//Check if 3D Object
else if (tempRenderer != null)
{
currentColor = tempRenderer.material.color;
mode = 4;
//ENABLE FADE Mode on the material if not done already
tempRenderer.material.SetFloat("_Mode", 2);
tempRenderer.material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
tempRenderer.material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
tempRenderer.material.SetInt("_ZWrite", 0);
tempRenderer.material.DisableKeyword("_ALPHATEST_ON");
tempRenderer.material.EnableKeyword("_ALPHABLEND_ON");
tempRenderer.material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
tempRenderer.material.renderQueue = 3000;
}
else
{
yield break;
}
while (counter < duration)
{
counter += Time.deltaTime;
float alpha = Mathf.Lerp(a, b, counter / duration);
switch (mode)
{
case 0:
tempSPRenderer.color = new Color(currentColor.r, currentColor.g, currentColor.b, alpha);
break;
case 1:
tempImage.color = new Color(currentColor.r, currentColor.g, currentColor.b, alpha);
break;
case 2:
tempRawImage.color = new Color(currentColor.r, currentColor.g, currentColor.b, alpha);
break;
case 3:
tempText.color = new Color(currentColor.r, currentColor.g, currentColor.b, alpha);
break;
case 4:
tempRenderer.material.color = new Color(currentColor.r, currentColor.g, currentColor.b, alpha);
break;
}
yield return null;
}
}
用法:
要淡出的游戏对象:
public GameObject SpriteRend;
3 秒后淡出
StartCoroutine(fadeInAndOut(SpriteRend, false, 3f));
在 3 秒内淡入
StartCoroutine(fadeInAndOut(SpriteRend, true, 3f));