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.