我对编码很陌生,我仍然在努力发展思维逻辑,以帮助我创建我想要的游戏解决方案。目前,我在Unity尝试创建一个2D GameObject,它是隐藏一扇秘密门的墙。当玩家GameObject触发它时,我希望GameObject淡出(大约90%),露出后面的空间和隐藏的门。
到目前为止,我已经设法弄清楚如何渲染'#34;秘密墙"在触发器上处于非活动状态,因此它会消失,但这并不会产生我想要的视觉效果。正如我所说的那样,我仍然在努力发展这种编码器的思维方式,所以虽然我已经做了很多研究来解决这个问题,但是很多结果我并没有做到。很容易理解。
这是我的代码:
main
答案 0 :(得分:5)
随着时间的推移淡出Sprite
几乎与moving GameObject相同,只不过你修改了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;
}
}
<强>用法强>:
GameObject褪色:
public GameObject SpriteRend;
3秒内淡出
StartCoroutine(fadeInAndOut(SpriteRend, false, 3f));
3秒内淡入
StartCoroutine(fadeInAndOut(SpriteRend, true, 3f));
答案 1 :(得分:1)
我完成此操作的方法是改变精灵颜色的alpha值。
颜色(R,G,B,A)。 A是alpha。