Como crear una animación de color desde C# en Unity

Normalmente cuando estamos creando un juego en Unity si queremos que algún gameObject tenga una animación lo hacemos a travez del editor que nos provee Unity llamado Animator. Con él podemos crear Animaciones o Clips en los cuales podemos modificar las propiedades de un gameObject para crear algún tipo de animación.
Esto es muy útil siempre y cuando no tengamos la necesidad de crear una animación de color, por ejemplo una interpolación de un color a otro. Te preguntaras cual es el problema, bueno pues si necesitas cambiar el color por una u otra razón desde el código Unity no lo permitirá, ya que bloquea el material que estamos usando mostrando un warning en la vista de material que dice MaterialProperyBlock y la única forma de cambiarlo seria desde un Clip o Animación.

warning materialPropertyBlock Warning MaterialPropertyBlock

Así es que en esta guía te mostraré una forma sencilla para crear una interpolación de color desde código usando un simple cubo.

Creando la animación

Para crear la animación vamos a usar dos conceptos basicos IEnumerator y Coroutines. No entraré en detalle de que es cada uno solo daré una simple explicación.

  • IEnumerator es un enumerador que nos permite iterar sobre el mismo y usar yield o WaitForSeconds para detener la ejecución hasta el siguiente frame(yield) o unos segundos específicos(WaitForSeconds).
  • Coroutines básicamente nos permite ejecutar una función en un hilo diferente al hilo principal.

Una vez claros algunos conceptos podemos iniciar con el código.

Lo primero que debemos hacer es crear un IEnumerator en cual contendrá el código que realizará la animación.

float delayTime = 1.0f;

IEnumerator ColorChange(Color newColor) {  
  float transitionRate = 0f;
  while (transitionRate < delayTime) {
    render.material.SetColor("_EmissionColor",Color.Lerp(render.material.GetColor("_EmissionColor"), newColor, transitionRate));
    transitionRate += Time.deltaTime * (delayTime + 1f);
    yield return null; // Esperar al siguiente frame
  }
  yield return null; // Esperar al siguiente frame
}

Ya tendiendo la definición de la función que crea la interpolación de color solo debemos invocarla, y aquí es donde entran en juego las Coroutines.

Para ver lo que sucede podemos agregar la siguiente linea de código dentro de la función void Start() y correr tu juego.

StartCoroutine(ColorChange(Color.yellow));  

animColor1

felicidades! 🎉 ya hemos creado una interpolación de color desde código.

Bonus

Si quieres crear un efecto de blink de forma suavizada solo tendrás que crear otro IEnumerator

IEnumerator Blink()  
    {
        while (true)
        {
            StartCoroutine(ColorChange(Color.red));
            yield return new WaitForSeconds(delayTime);
            StartCoroutine(ColorChange(Color.green));
            yield return new WaitForSeconds(delayTime);
        }
    }

Y cambiar siguiente linea dentro de la función void Start()

StartCoroutine(ColorChange(Color.yellow));  

por

StartCoroutine(Blink());  

blinkAnim

Sencillo verdad, pues bien espero que te haya gustado esta guía y recuerda que puedes comentar o compartir este post. Te dejo el link de GitHub donde podrás encontrar el código fuente de este proyecto si quieres revisar mas detalles.

Jose Aponte

Desarrollador full-stack apasionado por las tecnologías de información y los lenguajes de programación. Me gustan divertirme con mi familia, mi lema es "Nunca paras de Aprender"

Bogota

Subscribe to Jappsku Engineering Blog

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!