Variables públicas, privadas y atributos en Unity

Resumen

Configurar componentes en Unity depende de cómo declaras tus variables y de los atributos que les asignas. Aquí aprenderás a usar variables públicas, privadas y serializables en C# dentro de Unity, junto con los atributos que controlan cómo se muestran en el inspector, para que dejes de pelearte con el editor y empieces a aprovecharlo.

Cómo funcionan las variables públicas y privadas en Unity

Las variables que declaras al inicio de una clase, fuera de cualquier método, definen el estado de tu componente. Su modificador de acceso decide quién puede verlas y modificarlas.

Una variable pública aparece automáticamente en el inspector de Unity y puede ser leída o modificada por otros componentes. Piensa en el fantasmita de Mario Bros: necesita conocer la orientación de Mario para decidir si lo persigue o se queda quieto. Esa orientación vive como propiedad pública en el script de Mario, y el fantasma la consulta para reaccionar [02:00].

Una variable privada o protegida, en cambio, queda encapsulada dentro de la clase. No se muestra en el inspector y otros scripts no pueden tocarla. Si declaras una variable sin modificador, Unity la trata como privada por defecto y la oculta del editor.

¿Cuál es la diferencia entre public y private en Unity? Una variable public se ve y se edita desde el inspector y desde otros scripts. Una private queda escondida y solo es accesible dentro de su propia clase.

Qué son los atributos y para qué sirven en el inspector

Los atributos son decoraciones que pones encima de una variable para darle instrucciones especiales a Unity sobre cómo tratarla [03:30]. Cambian cómo se ve, cómo se edita o cómo se documenta sin alterar la lógica del código.

SerializeField y HideInInspector: mostrar u ocultar variables

Estos dos atributos hacen exactamente lo contrario y son los que más vas a usar.

  • SerializeField fuerza a que una variable privada aparezca en el inspector. Mantienes el encapsulamiento del código pero ganas la comodidad de configurarla desde el editor.
  • HideInInspector oculta una variable pública. Sigue siendo accesible desde otros scripts, pero el usuario del editor no puede tocarla por accidente.

La regla mental es simple: lo que esté justo debajo del atributo responde a esa instrucción.

Range, TextArea, Header, Space y Tooltip

Estos atributos mejoran la experiencia de quien configura el componente.

  • Range convierte un float o int en un slider con valor mínimo y máximo. Si defines un rango de 0 a 1, Unity te impide salir de ahí.
  • TextArea expande un campo string a un cuadro grande, ideal para diálogos o descripciones largas.
  • Header agrega títulos para agrupar variables relacionadas.
  • Space deja espacio en blanco entre propiedades para que el inspector respire.
  • Tooltip muestra un mensaje cuando dejas el cursor sobre la variable, perfecto para aclarar unidades o restricciones, por ejemplo "este valor está en metros, no en pies" [05:10].

¿Cómo muestro una variable privada en el inspector de Unity? Agrégale el atributo [SerializeField] justo arriba de la declaración. Unity la mostrará sin que pierdas el encapsulamiento.

Cómo usar arrays y clases serializables para datos complejos

Cuando una sola variable no alcanza, los arrays y las clases serializables te dan estructura.

Un array se declara con corchetes y aparece en el inspector como una lista expandible donde puedes añadir o quitar elementos. Sirve para colecciones simples como una lista de nombres de amigos.

El problema aparece cuando cada elemento tiene varias propiedades. Si intentas resolverlo con dos arrays paralelos, uno de nombres y otro de regalos, basta con insertar un elemento en medio para desincronizar todo y generar bugs [08:40].

Crear una clase serializable paso a paso

La solución correcta es definir una clase propia que agrupe las propiedades relacionadas.

  1. Declara una clase nueva, por ejemplo Amistad, sin heredar de MonoBehaviour.
  2. Dentro de la clase, define las propiedades que necesitas: nombre del amigo y un array de regalos.
  3. Marca la clase con el atributo [System.Serializable] para que Unity sepa cómo dibujarla en el inspector.
  4. En tu MonoBehaviour original, declara un array público de ese tipo, por ejemplo Amistad[] amistades.

Sin el atributo [System.Serializable], Unity no reconoce la clase como un tipo que sabe pintar y arroja un error. Tampoco olvides el using UnityEngine si vas a referenciar tipos como GameObject dentro de la clase.

El resultado es un inspector limpio donde cada amistad agrupa su nombre y sus regalos en un mismo bloque, y puedes añadir tantos elementos como quieras sin riesgo de desincronizar listas paralelas.

¿Qué hace el atributo System.Serializable? Le indica a Unity que una clase personalizada debe mostrarse y guardarse en el inspector como si fuera un tipo nativo, agrupando sus campos en un bloque editable.

Cuándo elegir cada tipo de variable en tus componentes

La decisión depende de quién necesita ver y modificar el dato.

  • Usa public cuando otro componente debe leer o escribir la variable, como la orientación de un personaje que sus enemigos consultan.
  • Usa private + SerializeField cuando solo el editor necesita configurarla, pero el código externo no debe tocarla.
  • Usa private sin atributos cuando es un detalle interno de la clase, como un contador temporal.
  • Usa clases serializables cuando manejes datos compuestos que se repiten en colecciones.

¿Has tenido algún bug por usar arrays paralelos en lugar de clases serializables? Cuéntalo en los comentarios.