Datos de los enemigos
Lección 2 de 18 del curso Juego de Unity: defensa de torres de Coddy.
Un juego de defensa de torres tiene distintos tipos de enemigos: soldados rasos, corredores rápidos y tanques lentos. Todos los soldados rasos caminan a la misma velocidad y empiezan con la misma salud, así que esos valores pertenecen al tipo, no a un enemigo en particular. Se guardan en un recurso ScriptableObject, uno por tipo, y cada enemigo de ese tipo apunta a él. Cambia el recurso y todos los enemigos de ese tipo cambiarán con él.
Un recurso no debe contener el estado de un solo enemigo. Un soldado raso que ha recibido un golpe tiene menos salud que el que va detrás, así que el recurso contiene maxHealth, la salud con la que empieza un soldado raso, y cada enemigo la copia en un campo propio. Un juego de carreras divide un auto de la misma manera:
[CreateAssetMenu(fileName = "NewCar", menuName = "Racing/Car Data")]
public class CarData : ScriptableObject
{
public float topSpeed = 30f;
public float tankSize = 50f;
}
public class Car : MonoBehaviour
{
public CarData data;
private float fuel;
void Awake()
{
fuel = data.tankSize;
}
}Todos los autos de un modelo comparten un CarData, y cada uno consume su propio fuel. Si en su lugar escribieras data.tankSize -= used, vaciarías el tanque de todos los autos de ese modelo a la vez y, en el Editor, el cambio permanecería en el recurso después de Play. Awake se ejecuta en cuanto se crea el objeto, así que la copia está lista antes de que nada pueda usarla.
Desafío
FácilUn Runner se une al Grunt: es más rápido y tiene menos salud. Dale a cada tipo su propio recurso.
- En
EnemyData.cs, haz que EnemyData se pueda crear desde el menú Create con el nombre de menúTower Defense/Enemy Data, y dale los campos públicosspeed(un float),maxHealthyreward(int). - En
Enemy.cs, reemplaza el campospeedpor un campo públicodatade tipo EnemyData, y haz que se mueva adata.speed. - Añade un int privado
health, cuyo valor sea elmaxHealthdel recurso enAwake.
El proyecto tiene un recurso GruntData (velocidad 2, salud 9, recompensa 5) y un recurso RunnerData (velocidad 3.5, salud 5, recompensa 3), y el Inspector asigna uno propio a cada enemigo. Pulsa Play y observa cómo Runner adelanta a Grunt; después, pulsa Check.
Pruébalo tú mismo
using UnityEngine;
// Más adelante: las estadísticas de un tipo de enemigo, como un recurso.
public class EnemyData : ScriptableObject
{
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.