c# unity3d 2d sprite

c# - Fading in/out GameObject



unity3d 2d (2)

Desvanecer un Sprite es casi lo mismo que moving GameObject con el tiempo, excepto que modifique su alfa en lugar de su posición.

Las tres cosas más importantes sobre el desvanecimiento de un objeto son Time.deltaTime , Mathf.Lerp/Color.Lerp y coroutine. Necesita comprender cómo funcionan juntos.

Inicie la rutina, use Time.deltaTime para incrementar una variable. Esa variable se usa para determinar cuánto ha funcionado esa función. En un ciclo for / while, use esa variable que se incrementa en cada cuadro y la duración en que desea que se produzca el desvanecimiento para generar el alfa con la ayuda de la función Mathf.Lerp . Cree un nuevo color con ese alfa y asígnelo al Sprite.

Esto se hace cada cuadro hasta que la variable que se incrementa con Time.deltaTime alcanza la duración en la que desea que ocurra el desvanecimiento.

Aquí hay una función de desvanecimiento SpriteRenderer simple:

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; } }

Si desea que se desvanezca, cambie Mathf.Lerp(1, 0, counter / duration); a Mathf.Lerp(0, 1, counter / duration); lo que hará que el alfa pase de 0 a 1 con el tiempo en lugar de 1 a 0 .

En el ejemplo anterior, escribir funciones de desvanecimiento y desvanecimiento solo requiere una forma de indicarle a la función que cambie el alfa de 1 a 0 o de 0 a 1 . Puede hacer que la función use una variable boolean o enum para determinar qué tipo de desvanecimiento realizar. Por supuesto, puede separar las funciones de fundido de entrada / salida, pero es bueno tenerlo en una sola función.

Aquí está la versión extendida de esa función que admite la aparición y desaparición gradual. También es compatible con casi todos los GameObjects como MeshRenderer (3D), SpriteRenderer (2D), Image , RawImage ... Puede extenderlo para admitir más componentes que faltan.

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; } }

Uso :

GameObject to fade:

public GameObject SpriteRend;

Desaparecer en 3 segundos

StartCoroutine(fadeInAndOut(SpriteRend, false, 3f));

Fundido de entrada en 3 segundos

StartCoroutine(fadeInAndOut(SpriteRend, true, 3f));

Soy bastante nuevo en la codificación, todavía estoy tratando de desarrollar esa lógica de pensamiento para ayudarme a crear las soluciones que quiero para los juegos. Actualmente, estoy en Unity tratando de crear un GameObject 2D que es un muro que esconde una puerta secreta. Quiero que GameObject se desvanezca (alrededor del 90%) cuando el jugador GameObject lo active, revelando el espacio detrás y la puerta oculta.

Hasta ahora, he logrado descubrir cómo hacer que el "muro secreto" se inactive en el gatillo, por lo que desaparece, pero esto no produce la imagen que busco. Como dije, todavía estoy trabajando en desarrollar la forma de pensar de ese codificador, por lo que si bien he investigado mucho para resolver este problema, muchos de los resultados no los entiendo fácilmente.

Aquí está mi código:

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


La forma en que he logrado esto ha sido cambiar el alfa en el color del sprite.

Color (R, G, B, A). A es el alfa.

  • SpriteRenderer.color = new Color (1f, 1f, 1f, 1f) es opaco.
  • SpriteRenderer.color = new Color (1f, 1f, 1f, .5f) es aproximadamente 50% transparente.
  • SpriteRenderer.color = new Color (1f, 1f, 1f, 0f) es aproximadamente 100% transparente, no se puede ver el sprite.