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:
// 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#
public | [SerializeField] private | |
|---|---|---|
| Aparece en el Inspector | Sí | Sí |
| Editable en el editor | Sí | Sí |
| Accesible desde otros scripts | Sí (cualquiera puede leer y escribir) | No |
| Comunica intención | "esto es parte de mi API" | "esto es un ajuste interno" |
| Riesgo de acoplamiento | Alto | Bajo |
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.
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:
[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].
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
publicsolo 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.