Volver a la página principal
lunes 12 mayo 2025
1

Uso y funcionamiento de propiedades en un Shader en Unity 🎮🧠

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.

¿Qué es un Shader en Unity?

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.

¿Qué son las propiedades en un Shader?

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.

Ejemplo básico:

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:

  • Nombre interno (como _Color)
  • Etiqueta legible (como "Main Color")
  • Tipo de dato (Color, 2D, Range, Float, etc.)
  • Valor por defecto

👉 ¡Y lo mejor! Estas propiedades se reflejan automáticamente en el editor de Unity como campos editables. ⚙️

Tipos de propiedades más comunes

Aquí tienes los tipos de propiedades que más se usan y cómo se declaran:

🔸 Color

_Color ("Main Color", Color) = (1,1,1,1)

Usado para aplicar color al objeto. Puede ser combinado con texturas.

🔸 Textura 2D

_MainTex ("Texture", 2D) = "white" {}

Asocia una imagen al material. Fundamental para materiales complejos.

🔸 Rango (Slider)

_Glossiness ("Smoothness", Range(0,1)) = 0.5

Ideal para controlar valores desde el editor con un deslizador.

🔸 Float

_Height ("Bump Height", Float) = 0.3

Valor decimal que se puede usar para controlar desplazamientos, intensidad, etc.

🔸 Vector

_Direction ("Light Direction", Vector) = (1, 0, 0, 0)

Usado para direcciones o posiciones en el espacio.

¿Dónde y cómo se usan dentro del Shader?

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.

Ejemplo:

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. 🖌️

Cómo acceder a propiedades del Shader desde C\#

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.

Ejemplo de acceso desde C#:

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. 🔁✨

Buenas prácticas al usar propiedades en Shaders

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:

✅ Nombra tus propiedades con lógica

Usa prefijos como _MainTex, _Color, _NormalMap, para que sean fáciles de identificar.

✅ Usa etiquetas descriptivas

Esto ayuda a los diseñadores a saber qué hace cada propiedad sin tener que revisar el código.

✅ Limita el uso excesivo de propiedades

Aunque son muy útiles, demasiadas propiedades pueden hacer que el material sea difícil de usar o que tenga un rendimiento más bajo.

✅ Agrupa propiedades en categorías

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 😅

Conclusió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.

Etiquetas:
unity
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer