Cambiar el color de un material por código

Introducción

En este artícu­lo vamos a a ver dos for­mas de cam­biar el col­or de un mate­r­i­al en Uni­ty a través de códi­go. Una con­siste en mod­i­ficar direc­ta­mente el col­or del mate­r­i­al definido en la car­pe­ta Assets y que esta asig­na­do al GameOb­ject al que se quiere cam­biar el col­or, la otra for­ma es acce­di­en­do a la instan­cia par­tic­u­lar del mate­r­i­al asig­na­do a un GameOb­ject específico.

Antes de seguir avan­zan­do dejo el vídeo que cubre la infor­ma­ción de este artículo

Cambiar el color de un material por código en Unity
🟢

También puede interesar:

En el vídeo ante­ri­or me pre­gun­taron cómo se puede mod­i­ficar sola­mente la com­pon­tente alfa de un mod­e­lo 3D a través de códi­go, para lograr que un obje­to se haga trans­par­ente, mi respues­ta fue el sigu­iente vídeo:

Cómo hacer un objeto transparente a través de código en Unity
🟢

Paquete para descargar

Puedes descar­gar el paque­te de Uni­ty que se mues­tra en el vídeo para impor­tar­lo en tu com­puta­do­ra y pro­bar sus funciones.

Elementos de la escena

Para analizar cómo cam­biar el col­or de un mate­r­i­al por códi­go en Uni­ty vamos a emplear la esce­na que se mues­tra en la sigu­iente imagen:

Fig. 1: Esce­na que viene den­tro del paque­te de Unity

En la jer­ar­quía hay un GameOb­ject que tiene asig­na­do un Script lla­ma­do ¨Change­Col­orScript¨ que es donde están definidas las vari­ables y fun­ciones nece­sarias para cam­biar el col­or del mate­r­i­al elegido.

Fig. 2: Script asig­na­do para cam­biar el col­or de un mate­r­i­al por código.

MIRA ESTE DESCABELLADO EXPERIMENTO

Script con funciones para cambiar el color de un material

En la figu­ra 3 podemos ver el Script que con­tro­la el sis­tema, en las líneas 7, 8 y 9 están definidas las vari­ables que vamos a uti­lizar, son las que apare­cen en el inspec­tor en la figu­ra 2, es impor­tante que las ref­er­en­cias de los obje­tos ade­cua­dos estén asig­nadas en estos cam­pos, sino vamos a ten­er un error de NullReferenceException. 

Una for­ma de ele­gir col­ores aleato­ri­a­mente es medi­ante la instruc­ción "Random.ColorHSV()", obser­ven que en las tres fun­ciones de la figu­ra 3 se uti­liza esta instruc­ción para asig­nar un col­or aleato­rio al material.

Fig. 3: Cotenido del script con dos méto­dos para mod­i­ficar el col­or de un mate­r­i­al en Unity.

En la figu­ra ante­ri­or tam­bién vemos tres fun­ciones que van a ser eje­cu­tadas al pul­sar los botones de la inter­faz grá­fi­ca que se ven en la figu­ra 1. 

La primera fun­ción lla­ma­da ¨Ran­dom Col­or Mate­r­i­al¨ cam­bia el col­or direc­ta­mente al mate­r­i­al asig­na­do en la vari­able, el efec­to que esto tiene es que todos los GameOb­jects que ten­gan asig­na­do ese mate­r­i­al se verán afec­ta­dos por el cam­bio de col­or. Además, si mod­i­fi­camos el col­or del mate­r­i­al de la car­pe­ta assets mien­tras esta­mos en el modo juego, al salir del modo juego el mate­r­i­al con­ser­vará ese color.

Fig. 4: Inspec­tor de un mate­r­i­al genéri­co en Unity.

Las otras dos fun­ciones de la figu­ra 3, "Ran­dom­Col­or­Cube" y "Ran­dom­Col­or­Sphere" real­izan la mis­ma fun­ción solo que una se apli­ca al cubo y la otra a la esfera. La idea en este caso es acced­er a la instan­cia del mate­r­i­al que está apli­ca­da sobre un GameOb­ject especí­fi­co y a esa instan­cia mod­i­fi­car­le el col­or. Para ello primero se accede al com­po­nente Ren­der­er que está asig­na­do sobre los obje­tos, en la figu­ra 5 vemos un com­po­nente MeshRen­der­er (que here­da de Ren­der­er), para acced­er a esta com­po­nente se usa la ref­er­en­cia del GameOb­ject del cubo o la esfera y luego la instruc­ción GetComponente<T>() donde T es el tipo de com­po­nente que quer­e­mos obten­er, en nue­stro caso Ren­der­er (o MeshRen­der­er). Una vez que ten­emos el com­po­nente Ren­der­er accedemos al mate­r­i­al asig­na­do a través del oper­ador pun­to, luego accedemos al col­or asig­na­do a ese mate­r­i­al y ese es el cam­po que escribi­mos con el col­or aleatorio. 

Como una obser­vación, en este caso se pudo acced­er al mate­r­i­al del Ren­der­er de esta for­ma porque se sabía de ante­mano que el Ren­der­er tenía asig­na­do un solo mate­r­i­al (como se obser­va en la figu­ra 5). En caso de que haya mas mate­ri­ales asig­na­do hay que acced­er al array Mate­ri­als y pasar el índice del mate­r­i­al al que se quiere acceder.

Fig. 5: Com­po­nente MeshRen­dere asig­na­do a un GameOb­ject que se encar­ga de ren­derizar un mod­e­lo 3D en pantalla.

El resul­ta­do de esto es que podemos cam­biar el col­or de cada mate­r­i­al indi­vid­ual, lo que desconec­ta momen­tánea­mente a los GameOb­jects del mate­r­i­al que está definido en la car­pe­ta Assets, al salir del modo juego se restablece la conex­ión con dicho material.

Fig. 6: El códi­go per­mite mod­i­ficar el col­or de un mate­r­i­al individualmente.

YouTube
Scroll al inicio
Secured By miniOrange