Cuando empecé a trabajar con Shaders en Unity, lo primero que me llamó la atención fue la capacidad de personalizarlos mediante propiedades expuestas en el Inspector. Esto no solo facilita la edición en tiempo real, sino que permite a los diseñadores y desarrolladores colaborar sin necesidad de editar el código del Shader directamente. En este artículo te voy a contar cómo funcionan estas propiedades, cómo declararlas correctamente y cómo sacarles el máximo provecho en tus proyectos.
Un Shader es un programa que se ejecuta en la GPU y se encarga de calcular cómo se deben representar visualmente los objetos en pantalla. En Unity, los Shaders se escriben principalmente en un lenguaje llamado ShaderLab, que actúa como envoltorio para instrucciones en HLSL o CG.
Cuando queremos que ciertos valores, como el color, la textura o la intensidad de brillo, puedan modificarse desde el editor, usamos propiedades.
Las propiedades en un Shader de Unity son variables que se declaran en el bloque Properties
y que pueden ser accedidas y modificadas desde el Inspector o mediante scripts en C#. Esto te permite crear materiales dinámicos y fácilmente configurables.
Shader "Custom/MyFirstShader" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Texture", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
}
SubShader {
// Aquí va la implementación del Shader
}
}
Como ves, cada propiedad tiene:
_Color
)
Main Color
")
Color
, 2D
, Range
, Float
, etc.)
👉 ¡Y lo mejor! Estas propiedades se reflejan automáticamente en el editor de Unity como campos editables. ⚙️
Aquí tienes los tipos de propiedades que más se usan y cómo se declaran:
_Color ("Main Color", Color) = (1,1,1,1)
Usado para aplicar color al objeto. Puede ser combinado con texturas.
_MainTex ("Texture", 2D) = "white" {}
Asocia una imagen al material. Fundamental para materiales complejos.
_Glossiness ("Smoothness", Range(0,1)) = 0.5
Ideal para controlar valores desde el editor con un deslizador.
_Height ("Bump Height", Float) = 0.3
Valor decimal que se puede usar para controlar desplazamientos, intensidad, etc.
_Direction ("Light Direction", Vector) = (1, 0, 0, 0)
Usado para direcciones o posiciones en el espacio.
Una vez que las propiedades están declaradas en el bloque Properties
, deben vincularse a variables internas dentro del CGPROGRAM. Este es el espacio donde escribimos la lógica real del Shader.
CGPROGRAM
#pragma surface surf Standard
sampler2D _MainTex;
fixed4 _Color;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutputStandard o) {
fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = tex.rgb * _Color.rgb;
o.Alpha = _Color.a;
}
ENDCG
Aquí estamos multiplicando el color base de la textura por el color definido en el inspector. Esto permite cambiar el tinte del objeto sin necesidad de modificar el código del Shader. 🖌️
Uno de los puntos más potentes es que estas propiedades se pueden modificar en tiempo de ejecución desde scripts en C#. Esto abre la puerta a efectos dinámicos, interfaces interactivas, feedback visual, etc.
public class CambiarColor : MonoBehaviour {
public Material miMaterial;
void Update() {
float t = Mathf.PingPong(Time.time, 1f);
miMaterial.SetColor("_Color", new Color(t, 0, 1 - t));
}
}
Este pequeño script hace que el color del material cambie dinámicamente en función del tiempo. Perfecto para efectos animados o para feedback visual en el juego. 🔁✨
Después de varios años desarrollando efectos visuales, te puedo decir que mantener una buena organización en tus Shaders es fundamental. Aquí algunas recomendaciones:
Usa prefijos como _MainTex
, _Color
, _NormalMap
, para que sean fáciles de identificar.
Esto ayuda a los diseñadores a saber qué hace cada propiedad sin tener que revisar el código.
Aunque son muy útiles, demasiadas propiedades pueden hacer que el material sea difícil de usar o que tenga un rendimiento más bajo.
Aunque ShaderLab no tiene un sistema nativo para secciones, puedes usar comentarios y nombres consistentes para simularlo.
Consejo: Siempre que puedas, documenta el propósito de cada propiedad en comentarios. Tus futuros "yo" (o tus compañeros) te lo agradecerán 😅
Las propiedades en los Shaders de Unity son una herramienta esencial para crear materiales flexibles, editables y potentes. Nos permiten abrir una ventana entre el código y el editor, y facilitan el trabajo en equipo entre programadores, diseñadores y artistas.
Dominar su uso es dar un gran paso en el camino hacia la creación de gráficos espectaculares y efectos visuales personalizados en Unity. 🚀
Ya sea para cambiar colores en tiempo real, adaptar texturas o controlar parámetros como el brillo o la opacidad, las propiedades te permitirán sacar el máximo partido de tus Shaders.
Jorge García
Fullstack developer