🎮 UnityDocs

[SerializeField] vs public

Las dos formas de exponer una variable en el Inspector y por qué [SerializeField] private es casi siempre la correcta. Encapsulación desde el minuto uno, explicada con ejemplos.

⚖️ ComparativaPrincipiante✅ RevisadoUnity 6.0 LTSActualizado 2026-07-14
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 5 min

El resumen de una línea#

Para que una variable aparezca en el Inspector, usa [SerializeField] private, no public. Consigues lo mismo (editarla en el editor) sin abrir la puerta a que otros scripts la modifiquen por accidente.

El dilema#

Quieres ajustar la velocidad de un personaje desde el Inspector sin recompilar. Tienes dos formas:

C#
// Opción A: pública
public float velocidad = 5f;

// Opción B: privada pero serializada
[SerializeField] private float velocidad = 5f;

Ambas aparecen en el Inspector y ambas se pueden editar ahí. La diferencia está en el acceso desde código.

Comparativa#

⚖️ Comparativa · public vs [SerializeField] private
public[SerializeField] private
Aparece en el Inspector
Editable en el editor
Accesible desde otros scriptsSí (cualquiera puede leer y escribir)No
Comunica intención"esto es parte de mi API""esto es un ajuste interno"
Riesgo de acoplamientoAltoBajo

Por qué importa la encapsulación#

Si velocidad es public, cualquier script puede hacer jugador.velocidad = 9999f desde cualquier parte. Cuando el proyecto crece, rastrear quién cambió un valor se vuelve una pesadilla. Marcándola private, el compilador garantiza que solo tu clase la toca: el valor está bajo control.

Regla práctica

public solo para lo que de verdad forma parte de la interfaz de tu clase (métodos que otros llaman, propiedades que otros leen). Para simples ajustes de diseño, [SerializeField] private.

¿Y si otro script necesita leer el valor?#

Expón una propiedad de solo lectura, no el campo entero:

C#
[SerializeField] private float velocidad = 5f;

// Otros pueden LEER, pero no ESCRIBIR
public float Velocidad => velocidad;

Así mantienes el control: los demás consultan, pero solo tu clase decide cuándo cambia.

Qué se puede serializar#

Unity muestra en el Inspector los tipos que sabe serializar: int, float, bool, string, Vector3, Color, enums, referencias a componentes/objetos, y listas/arrays de esos tipos. Para tipos propios, márcalos con [System.Serializable].

Las propiedades no se serializan

Un public float Velocidad { get; set; } (propiedad automática) no aparece en el Inspector: Unity serializa campos, no propiedades. Por eso el patrón es campo [SerializeField] private + propiedad de solo lectura.

Errores frecuentes#

  • Hacer todo public "por si acaso": rompe la encapsulación y ensucia el Inspector.
  • Esperar que una propiedad { get; set; } salga en el Inspector (no sale).
  • Usar public solo para verlo en el Inspector cuando [SerializeField] hace justo eso sin exponerlo.

Resumen#

public y [SerializeField] private muestran igual la variable en el Inspector, pero public además la abre a todo el proyecto. Usa [SerializeField] private para ajustes internos y reserva public para lo que sea de verdad la interfaz de tu clase. Si otros necesitan leer, da una propiedad de solo lectura.

Fuentes y para profundizar