La recolección de pociones en Unity es más clara y mantenible cuando el objeto jugador se referencia una sola vez y se notifica con métodos específicos. Aquí verás cómo vincular el PlayerController desde el script Collectable, llamar a los métodos de curación y maná, y preparar las pociones en escena con diferencias visuales claras. Todo con C# y buenas prácticas para evitar errores comunes.
¿Qué solucionamos al recoger pociones en Unity?
Al recoger una poción, ya no se notifica al game manager (como con las monedas en el switch), sino directamente al PlayerController. Como el jugador no es un singleton, se accede por nombre con GameObject.Find y luego con GetComponent para invocar los métodos correctos. Además, se evita el error de declarar la variable del jugador dentro de cada caso del switch.
- Objetivo: notificar al jugador al tomar pociones de vida o de maná.
- Cambio clave: de game manager a PlayerController en la lógica de recolección.
- Problema detectado: variable duplicada dentro del switch marcándose en rojo.
- Solución: mover la referencia del jugador fuera del switch e inicializarla una sola vez.
¿Por qué no usar un singleton para PlayerController?
Porque el PlayerController no es un singleton. Se accede al objeto con nombre en escena usando GameObject.Find("Player") y, desde ahí, al componente del jugador. Es directo y suficiente para esta necesidad.
¿Cómo evitar el conflicto dentro del switch?
El switch no delimita ámbitos como un if/else. Declarar la misma variable en dos casos distintos puede generar conflicto. Se declara una sola referencia al jugador fuera del switch (incluso como campo privado) y se inicializa en Start. Así desaparecen los errores y el código queda más limpio.
¿Cómo notificar al jugador con GameObject.find y getcomponent?
Primero se localiza el objeto jugador por nombre y, después, se llama al componente para aplicar el efecto de la poción. Las llamadas son directas y expresivas: CollectHealth para vida y CollectMana para maná, pasando this.value como cantidad.
// Búsqueda inicial (ejemplo local):
GameObject player = GameObject.Find("Player");
// Notificar recolección de poción de vida:
player.GetComponent<PlayerController>()
.CollectHealth(this.value);
// Notificar recolección de poción de maná:
player.GetComponent<PlayerController>()
.CollectMana(this.value);
¿Dónde inicializar la referencia al player?
Mejor en Start, una sola vez. Así evitas repetir código en cada caso del switch y eliminas el error por duplicidad.
// En Collectable:
private GameObject player;
void Start()
{
// Ojo: GameObject con G mayúscula es la clase de Unity.
// gameObject con g minúscula es la instancia asociada al script.
player = GameObject.Find("Player");
}
// Luego, cuando corresponda:
player.GetComponent<PlayerController>().CollectHealth(this.value);
player.GetComponent<PlayerController>().CollectMana(this.value);
Clave: una sola referencia compartida en la clase evita declarar variables dentro del switch y simplifica las llamadas.
¿Qué diferencia hay entre GameObject y gameObject?
- GameObject (mayúscula): la clase de Unity para buscar y manipular objetos en escena.
- gameObject (minúscula): la instancia del objeto al que está asociado el script actual.
¿Cómo configurar y diferenciar las pociones en escena?
Se parte de un único asset de poción en Sprites. Se arrastra a la escena, se le añade el script Collectable, y se configura su tipo y valor. Luego se duplica para la versión de maná, se tiñe el color para distinguirlas y se añade un Circle Collider a cada una para que puedan recolectarse.
¿Qué valores y tipos asignar en el inspector?
- Asignar el script Collectable al objeto poción.
- Elegir tipo: poción de vida para la primera. Valor: 100 puntos (mitad de 200 de vida total).
- Duplicar el objeto (Command D o Control D).
- Configurar la segunda como poción de maná. Valor: 15 puntos de maná.
¿Cómo distinguir visualmente las pociones con el sprite renderer?
- Usar el sprite renderer y su tinte de color.
- Para vida: seleccionar rojo con el cuentagotas.
- Para maná: seleccionar azul.
- Si el color queda muy intenso, bajar la tonalidad. Elegir un tono más suave para no confundirse con el fondo.
¿Qué colisionador usar para activar la recolección?
- Añadir un circle collider a cada poción.
- Ajustar el tamaño al área deseada de recolección.
- Probar en Play: ambas pociones deben recolectarse al tocarlas. Es un buen indicio de que la lógica funciona.
¿Quieres seguir afinando esta mecánica o te quedan dudas sobre la referencia al jugador o la configuración del sprite renderer? Comparte tus preguntas y casos en los comentarios.