Clase vs objeto#
Una clase es un molde: describe qué datos y qué comportamientos tendrá algo. Un objeto es una copia concreta hecha a partir de ese molde.
Analogía: la clase "Enemigo" es el plano; cada goblin en pantalla es un objeto creado con ese plano, con sus propios valores.
public class Enemigo
{
// Campos: los datos de cada enemigo
public string nombre;
public int vida = 100;
// Método: un comportamiento
public void RecibirDaño(int cantidad)
{
vida -= cantidad;
if (vida <= 0)
Morir();
}
void Morir()
{
Debug.Log(nombre + " ha muerto");
}
}Crear objetos con new#
Enemigo goblin = new Enemigo(); // crea un objeto (una instancia)
goblin.nombre = "Goblin";
goblin.RecibirDaño(30); // ahora goblin.vida = 70
Enemigo orco = new Enemigo(); // otro objeto, independiente
orco.vida = 200; // el goblin no se enteraCada objeto tiene su propia copia de los campos: cambiar el orco no afecta al goblin.
Constructores#
Un constructor es un método especial que se ejecuta al crear el objeto, para dejarlo listo. Lleva el nombre de la clase:
public class Enemigo
{
public string nombre;
public int vida;
// Constructor
public Enemigo(string nombre, int vida)
{
this.nombre = nombre; // 'this' distingue el campo del parámetro
this.vida = vida;
}
}
// Uso: se le pasan los valores al crearlo
Enemigo jefe = new Enemigo("Dragón", 500);Esto vale para clases normales de C#. Pero los MonoBehaviour (los scripts que pegas a GameObjects) no se crean con new ni usan constructor: los instancia Unity. Su "constructor" es el método Awake. Ver el ciclo de vida.
Propiedades: acceso controlado#
Una propiedad parece un campo pero puede controlar la lectura/escritura. Sirve para exponer datos sin dejar que se modifiquen sin control:
public class Jugador
{
// Se lee desde fuera, pero solo la propia clase la cambia
public int Vida { get; private set; } = 100;
// Propiedad con lógica
public bool EstaVivo => Vida > 0; // solo lectura, calculada
public void RecibirDaño(int d)
{
Vida = Mathf.Max(0, Vida - d);
}
}Un campo es una variable simple. Una propiedad ({ get; set; }) es un envoltorio que permite validar, calcular o restringir el acceso. Regla práctica: expón datos como propiedades (a menudo get público, set privado) y deja los campos como detalle interno.
Relación con Unity#
Cada script que arrastras a un GameObject es una clase (que hereda de MonoBehaviour). Cuando pones ese script en un objeto, Unity crea un objeto de esa clase. Por eso dos enemigos con el mismo script tienen cada uno sus propios valores: son dos objetos del mismo molde. Esto conecta directamente con GameObjects y Componentes.
Errores frecuentes#
- Confundir la clase (el molde) con el objeto (la instancia).
- Esperar que cambiar un objeto afecte a los demás (cada uno es independiente).
- Usar
newpara crear un MonoBehaviour (nunca; lo hace Unity). - Hacer todos los campos
publicen vez de exponer propiedades controladas.
Ponte a prueba#
Resumen#
Una clase es un molde con campos (datos) y métodos (comportamientos); un objeto es una instancia concreta creada con new, con sus propios valores. Los constructores inicializan y las propiedades dan acceso controlado. En Unity, tus scripts son clases que hereda de MonoBehaviour e inicializan en Awake, no con new. Siguiente: herencia e interfaces.