淡入/淡出一个 Sprite
与移动游戏对象类似,只是你需要修改它的透明度而不是它的位置。
关于淡化对象,最重要的三个要素是Time.deltaTime
、Mathf.Lerp/Color.Lerp
和协程。您需要了解这些如何共同使用。
启动协程,并使用Time.deltaTime
来增加变量。该变量用于确定该函数运行了多少。在for
/while
循环中,使用每帧递增的变量和您想要淡化发生的持续时间来生成 alpha,借助Mathf.Lerp
函数创建新颜色,并将其分配给 Sprite。
这样做,直到使用Time.deltaTime
递增的变量达到您想要在其中发生淡化的持续时间为止。
这是一个简单的SpriteRenderer
淡化函数:
public SpriteRenderer spriteToFade;
IEnumerator fadeOut(SpriteRenderer MyRenderer, float duration)
{
float counter = 0;
Color spriteColor = MyRenderer.material.color;
while (counter < duration)
{
counter += Time.deltaTime;
float alpha = Mathf.Lerp(1, 0, counter / duration);
Debug.Log(alpha);
MyRenderer.color = new Color(spriteColor.r, spriteColor.g, spriteColor.b, alpha);
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
变量来确定要执行哪种类型的淡入/淡出。当然,您可以将淡入/淡出函数分开,但将其放在一个函数中很好。
以下是扩展版本的函数,支持淡入和淡出,并支持几乎所有GameObject,例如
MeshRenderer
(3D)、
SpriteRenderer
(2D)、
Image
、
RawImage
...... 您可以扩展它以支持更多缺失的组件。
IEnumerator fadeInAndOut(GameObject objectToFade, bool fadeIn, float duration)
{
float counter = 0f;
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>();
if (tempSPRenderer != null)
{
currentColor = tempSPRenderer.color;
mode = 0;
}
else if (tempImage != null)
{
currentColor = tempImage.color;
mode = 1;
}
else if (tempRawImage != null)
{
currentColor = tempRawImage.color;
mode = 2;
}
else if (tempText != null)
{
currentColor = tempText.color;
mode = 3;
}
else if (tempRenderer != null)
{
currentColor = tempRenderer.material.color;
mode = 4;
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));