淡入/淡出GameObject

我对编码很新,我仍然在努力发展思维逻辑,以帮助我创建我想要的游戏解决方案。 目前,我正在Unity尝试创建一个2D GameObject,这是一个隐藏秘密门的墙。 当玩家GameObject触发它时,我希望GameObject淡出(大约90%),露出后面的空间和隐藏的门。

到目前为止,我已经设法弄清楚如何在触发器上呈现“秘密墙”GO无效,所以它消失了,但这并不会产生我想要的视觉效果。 正如我所说的那样,我仍在努力开发编码器的思维方式,所以虽然我已经做了很多研究来解决这个问题,但很多结果我都不太清楚。

这是我的代码:

using System.Collections; using System.Collections.Generic; using UnityEngine; public class SecretDoor1 : MonoBehaviour { void OnTriggerEnter2D (Collider2D SecretDoorTrig) { if (SecretDoorTrig.gameObject.tag == "Player") { GetComponent ().enabled = false; } else { GetComponent ().enabled = true; } } void OnTriggerExit2D (Collider2D SecretDoorTrig) { if (SecretDoorTrig.gameObject.tag == "Player") { GetComponent ().enabled = true; } else { GetComponent ().enabled = false; } } } 

淡化Sprite几乎与移动 GameObject一样,除了你修改它的alpha而不是它的位置。

关于淡化对象的三个最重要的东西是Time.deltaTimeMathf.Lerp/Color.Lerp和coroutine。 您需要了解这些如何协同工作。

启动协同程序,使用Time.deltaTime来增加变量。 该变量用于确定该函数的运行程度。 在for / while循环中,使用每帧递增的变量以及希望淡入淡出的持续时间,以便在Mathf.Lerp函数的帮助下生成alpha。 使用该alpha创建新颜色,并将其指定给Sprite。

这是在每一帧完成的,直到用Time.deltaTime递增的变量达到你想要在其中发生淡入淡出的持续时间。

这是一个简单的SpriteRenderer淡入淡出function:

 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而不是10


从上面的例子中,编写淡出和淡入function只需要一种方法来告诉函数将alpha从1更改为0或从0更改为1 。 您可以使该函数使用booleanenum变量来确定要执行的淡入淡出类型。 当然,您可以将淡入/淡出function分开,但最好将它放在一个function中。

这是该function的扩展版本,支持淡入和淡出。 它还支持几乎所有MeshRenderer ,如MeshRenderer (3D), SpriteRenderer (2D), ImageRawImage ....您可以扩展它以支持更多缺少的组件。

 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(); Image tempImage = objectToFade.GetComponent(); RawImage tempRawImage = objectToFade.GetComponent(); MeshRenderer tempRenderer = objectToFade.GetComponent(); Text tempText = objectToFade.GetComponent(); //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)); 

我完成这个的方式是改变精灵颜色的alpha。

色(R,G,B,A)。 A是alpha。

  • SpriteRenderer.color = new Color(1f,1f,1f,1f)是不透明的。
  • SpriteRenderer.color = new Color(1f,1f,1f,.5f)透明度约为50%。
  • SpriteRenderer.color = new Color(1f,1f,1f,0f)约100%透明,无法看到精灵。