Todos los parámetros de un Material que usted ve en el inspector cuando ve un material son accesibles vía script, dándole a usted el poder de cambiar o animar cómo un material funciona en tiempo de ejecución.
Esto le permite a usted modificar valores numéricos en el Material, cambiar colores, e intercambiar texturas dinámicamente durante el gameplay. Algunas de las funciones más comúnmente utilizadas para hacer esto son:
Nombre de la función | Utilice |
---|---|
SetColor | Cambia el color del material (Eg. el color tine albedo) |
SetFloat | Configura un valor punto flotante (Ef. el multiplicador normal map) |
SetInt | Establece un valor entero en el material |
SetTexture | Asigna una nueva textura al material |
El conjunto completo de funciones disponibles para manipular materiales vía script se pueden encontrar en la referencia de scripting de la clase Material.
Una importante aclaración es que estas funciones solamente configuran propiedades que están disponibles para el shader actual en el materia. Esto significa que si usted tiene un shader que no utiliza texturas, o si usted no tiene un shader delimitado en absoluto, llamar SetTexture no tendrá efecto. Esto es true incluso si usted después configura un shader que necesita la textura. Por esta razón se recomienda que usted configure el shader que usted quiere antes de configurar cualquier propiedad, sin embargo una vez usted lo ha hecho esto usted puede cambiar de un shader a otro que utilice las mismas texturas o propiedades y los valores serán preservados.
Estas funciones funcionan como esperaría para todos los shaders simple como los legacy shaders, y los shaders integrados a diferencia del Standard Shader (por ejemplo, el particle, sprite, UI y unlit shaders). Para un material que utiliza el Standard Shader sin embargo, hay algunos requerimientos adicionales que debe tener en cuenta antes de modificar completamente el Material.
El Standard Shader tiene algunos requerimientos adicionales si usted quiere modificar los materiales en tiempo de ejecución, ya que - detrás de escenas - hay en realidad muchos shaders diferentes todos en uno.
Estos diferentes tipos de shader se llaman Shader Variants y se pueden pensar como todas las combinaciones diferentes posibles de las características shader cuando están activadas o desactivadas.
Por ejemplo, si usted escoge asignar un Normal Map a su material, usted activa esa variant del shader que soporta Normal Mapping. Si usted posteriormente también asigna un Height Map entonces usted activa la variant del shader que soporta Normal Mapping y Height Mapping.
Es un buen sistema, ya que significa que si está utilizando el Standard Shader, pero no utiliza un Normal Map en un cierto Material, usted no está incurriendo en el costo de rendimiento de ejecutar el código shader del Normal Map - ya que usted está ejecutando una variant del shader con ese código emitido. También significa que si usted nunca utiliza una combinación de ciertas características (tal como HeightMap & Emissive juntos), esa variant completamente se omite de su construcción - y en práctica usted típicamente solamente utilizará un pequeño número de variants posibles del Standard Shader.
Unity evita simplemente incluir todas las posibles shader variants en su construcción, ya que este sería un número muy grande, algunas decenas de miles! Este número alto es el resultado no sólo de cada posible combinación de características disponibles en el inspector de materiales, sino también hay variantes de cada combinación de características para diferentes escenarios de renderizado, como si se está usando HDR, mapas de luz, GI, niebla, etc. . Incluir todos estos causaría carga lenta, consumo de memoria alto, y aumentar su tamaño de construcción y tiempo de construcción.
Más bien, Unity le hace seguimiento a qué variants ha utilizado al examinar los assets de material utilizados en su proyecto. Independientemente de las variants del Standard Shader que haya incluido en su proyecto, éstas son las variantes que se incluyen en la construcción.
Esto presenta dos problemas por separado cuando acceda materiales vía script que utilice el Standard Shader.
Si usted utiliza scripting para cambiar un Material que causaría que se utilizará una variant diferente del Standard Shader, usted debe habilitar esa variant utilizando la función EnableKeyword. Una variant diferente se requeriría si usted empieza utilizando una características shader que inicialmente no estuvo en uso por el material. Por ejemplo, asignar un Normal Map a un Material que no tenía uno, o configurar el nivel de Emissive a un valor mayor que cero cuando previamente era cero.
Las palabras claves específicas que se requieren para habilitar las características del Standard Shader son las siguientes:
Palabra clave | Característica |
---|---|
_NORMALMAP | Normal Mapping |
_ALPHATEST_ON | “Cut out” Transparency Rendering Mode |
_ALPHABLEND_ON | “Fade” Transparency Rendering Mode |
_ALPHAPREMULTIPLY_ON | “Transparent” Transparency Rendering Mode |
_EMISSION | Emission Colour o Emission Mapping |
_PARALLAXMAP | Height Mapping |
_DETAIL_MULX2 | Secondary “Detail” Maps (Albedo & Normal Map) |
_METALLICGLOSSMAP | Metallic/Smoothness Mapping en Metallic Workflow |
_SPECGLOSSMAP | Specular/Smoothness Mapping en Specular Workflow |
Utilizando las palabras claves de arriba es suficiente para recibir sus modificaciones del Material script mientras trabaje en el editor.
No obstante, ya que Unity solamente revisa por materiales utilizados en su proyecto para determinar qué variants incluir en su construcción, no incluirá variants que solamente se encuentran vía script en tiempo de ejecución.
Esto significa que si usted habilita la palabra clave _PARALLAXMAP para un Material en su script, pero no tiene un Material utilizado en su proyecto que coincida con la misma combinación de características, el parallax mapping no funcionará en la construcción final - incluso si parezca que funcione en el editor. Esto se debe a que la variant será omitida desde la construcción porque parece que no porque no parece ser necesario.
Para hacer esto, usted necesita asegurarse que Unity sepa que usted quiere utilizar esa shader variant al incluir al menos un Material de ese tipo en sus Assets. El material debe ser utilizado en una escena o alternativamente se debe colocar en su carpeta de Resources - de lo contrario Unity lo omitirá de su construcción, porque parece sin utilizar.
Al completar ambos de los pasos de arriba, usted tiene la habilidad completa de modificar sus Materiales utilizando el Standard Shader en tiempo de ejecución.
Si usted está interesado en aprender más acerca de los detalles del shader variants, y cómo escribir sus propios, lea más acerca de Crear varias shader program variants aquí.