Introducción
En este artículo vamos a a ver dos formas de cambiar el color de un material en Unity a través de código. La primera forma consiste en modificar directamente el color del material definido en la carpeta Assets. La otra forma es accediendo a la instancia particular del material asignado a un GameObject específico.
Paquete para descargar
Puedes descargar el paquete de Unity para importarlo en tu proyecto, obtendrás los Assets que se utilizan en el vídeo.
En el siguiente vídeo vemos cómo cambiar el color de un material por código en Unity.
Cómo hacer un material transparente a través de código en Unity
En los comentarios del canal me preguntaron cómo se puede modificar solamente la compontente alfa de un modelo 3D a través de código, es decir la componente de transparencia del color y de esa forma lograr que un objeto se haga transparente, mi respuesta fue el siguiente vídeo:
Elementos de la escena
Para analizar cómo cambiar el color de un material por código en Unity vamos a emplear la escena que se muestra en la siguiente imagen:
En la jerarquía hay un GameObject que tiene asignado un Script llamado ¨ChangeColorScript¨ que es donde están definidas las variables y funciones necesarias para cambiar el color del material elegido.
Script con funciones para cambiar el color de un material
En la figura 3 podemos ver el Script que controla el sistema, en las líneas 7, 8 y 9 están definidas las variables que vamos a utilizar, son las que aparecen en el inspector en la figura 2, es importante que las referencias de los objetos adecuados estén asignadas en estos campos, sino vamos a tener un error de NullReferenceException.
Una forma de elegir colores aleatoriamente es mediante la instrucción «Random.ColorHSV()», observen que en las tres funciones de la figura 3 se utiliza esta instrucción para asignar un color aleatorio al material.
En la figura anterior también vemos tres funciones que van a ser ejecutadas al pulsar los botones de la interfaz gráfica que se ven en la figura 1.
La primera función llamada ¨Random Color Material¨ cambia el color directamente al material asignado en la variable, el efecto que esto tiene es que todos los GameObjects que tengan asignado ese material se verán afectados por el cambio de color. Además, si modificamos el color del material de la carpeta assets mientras estamos en el modo juego, al salir del modo juego el material conservará ese color.
Las otras dos funciones de la figura 3, «RandomColorCube» y «RandomColorSphere» realizan la misma función solo que una se aplica al cubo y la otra a la esfera. La idea en este caso es acceder a la instancia del material que está aplicada sobre un GameObject específico y a esa instancia modificarle el color. Para ello primero se accede al componente Renderer que está asignado sobre los objetos, en la figura 5 vemos un componente MeshRenderer (que hereda de Renderer), para acceder a esta componente se usa la referencia del GameObject del cubo o la esfera y luego la instrucción GetComponente<T>() donde T es el tipo de componente que queremos obtener, en nuestro caso Renderer (o MeshRenderer). Una vez que tenemos el componente Renderer accedemos al material asignado a través del operador punto, luego accedemos al color asignado a ese material y ese es el campo que escribimos con el color aleatorio.
Como una observación, en este caso se pudo acceder al material del Renderer de esta forma porque se sabía de antemano que el Renderer tenía asignado un solo material (como se observa en la figura 5). En caso de que haya mas materiales asignado hay que acceder al array Materials y pasar el índice del material al que se quiere acceder.
El resultado de esto es que podemos cambiar el color de cada material individual, lo que desconecta momentáneamente a los GameObjects del material que está definido en la carpeta Assets, al salir del modo juego se restablece la conexión con dicho material.