El postprocesado en Unity es una de las mejores, y más sencillas, formas de conseguir un espectacular acabado para nuestros juegos. Pero si aprendemos a modificar los valores desde los scripts con C# podremos variar fácilmente la presentación del juego en tiempo de ejecución.
En la imagen superior tenemos un post process GameObject tal como se ve en el editor de Unity.
Encontramos tres efectos configurados:
Vignette.
Grain.
Color Grading.
Veamos el ejemplo de cómo modificar los tres desde un script. Este script tiene que estar en mismo gameobject que contiene el PostProcessVolume, o en su defecto le tendríamos que indicar de alguna forma el postprocessvolume si no puede acceder a él.
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.PostProcessing; public class ModifyPostProcess : MonoBehaviour { //Contiene la referencia a PostProcessVolume que queremos modificar private PostProcessVolume _ppv; //Para cada uno de los efectgos que queremos modificar definimos una variable de su tipo private ColorGrading _cg; private Grain _grain; private Vignette _vignette; private void Start() { /*Recuperamos los valores de las diferentes variables. Primero el postprocessVolume y después continuamos con el valor de cada uno de los efectos, solo hay que llamar a la función TryGetSettings, pasando como parámetro de salida una variable de tipo del efecto que queremos recuperar. */ _ppv = gameObject.GetComponent<PostProcessVolume>(); _ppv.profile.TryGetSettings(out _cg); _ppv.profile.TryGetSettings(out _grain); _ppv.profile.TryGetSettings(out _vignette); } public void ModificaSaturacion() { /*En esta función se modifica la saturación, es una variable del ColorGrading, por lo que usamos la variable de su tipo, y el nombre del parámetro a modificar coincide con la mostrada en el editor de unity */ _cg.saturation.value = +10; } public void Color() { /*Aquí modificamos el color del colorfilter del ColorGrading */ float factor = 0.005f; Color color = new Color(142 * factor, 155 * factor, 96 * factor); _cg.colorFilter.value = color; } public void Flash(float r, float g, float b, float factor) { /*Se modifica el colorFilter*/ Color color = new Color(r * factor, g * factor, b * factor); _cg.colorFilter.value = color; } public void Darker() { /*Modificamos los efectos Grain y Vignette*/ _grain.intensity.value += 0.025f; _grain.size.value += 0.11f; _vignette.intensity.value += 0.025f; } }
Como se puede ver es un código muy sencillo, y auto explicado. Se definen las variables del tipo de efecto que se quiere modificar, se recupera el valor con la función TryGetSettings de PostProcessVolume, y a partir de aquí tan solo hay que ir modificando los valores de lo que se quiera modificar.
En la imagen una muestra de un ejemplo, del juego Memories, conseguido al modificar el colorfilter del colorgrading!