Defensa de torres básica
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 61 de 64.
Los enemigos avanzan por el camino hacia tu base, y una sola torre la defiende. La torre dispara proyectiles al enemigo más cercano mientras esté dentro del alcance, y cada enemigo que derrota te da oro. La barra espaciadora gasta el oro para subir la torre al siguiente nivel: con cada nivel, su alcance aumenta, dispara más rápido o golpea con más fuerza. Si un enemigo llega a la base, consigue atravesarla. Los niveles son datos del juego que un diseñador ajusta en un recurso, sin tocar el código, y la torre dispara muchos proyectiles, así que los reutiliza de un grupo en lugar de crear y destruir uno por cada disparo.
Escribe dos scripts: TowerData, el tipo de recurso, y Tower. Creep, Bolt y CreepSpawner ya están listos, al igual que Nearest y Show de la torre.
Desafío
DifícilTermina la torre; Nearest(range) y Show() están listos.
TowerLevel: serializable, públicorange,fireEvery,damage,cost.TowerDatacontienepublic List<TowerLevel> levels.- Cada
fireEverysegundos, siNearest(range)encuentra un creep, coloca un proyectil de unObjectPool<Bolt>en la torre:bolt.Launch(creep, damage, pool.Release). Show()después de queCreep.Killedotorguebountyy después de que la barra espaciadora compre el siguiente nivel por sucost, registrandoTower level 2.
Pulsa «Jugar» y mejora la torre. Después, pulsa «Comprobar».
Pruébalo tú mismo
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Pool;
using TMPro;
public class Tower : MonoBehaviour
{
[SerializeField] private TowerData data;
[SerializeField] private Bolt boltPrefab;
[SerializeField] private TMP_Text infoText;
private int level;
private int gold;
// Listo: el creep más cercano a la torre dentro del alcance, o null.
Creep Nearest(float range)
{
Creep nearest = null;
float best = Mathf.Infinity;
foreach (Collider hit in Physics.OverlapSphere(transform.position, range))
{
if (hit.TryGetComponent(out Creep creep))
{
float distance = Vector3.Distance(transform.position, creep.transform.position);
if (distance < best)
{
best = distance;
nearest = creep;
}
}
}
return nearest;
}
// Listo: muestra el nivel y el oro, como Level 1, 0 gold.
void Show()
{
infoText.text = "Level " + (level + 1) + ", " + gold + " gold";
}
}
Todas las lecciones de Arquitectura de juegos en Unity
1Componentes, no jerarquías
Componentes pequeñosUn script base para enemigosComponentes abstractosComponentes que trabajan juntosRepaso: torreta modularRepaso: cañón doble4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botínRepaso: sortear el botín2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: Tecla de interacciónRepaso: El más cercano al alcance5ScriptableObjects
Activos de datosEstadísticas de armasConfiguración compartidaGuardar el vientoOleadas como datosRepaso: base de datos de objetosRepaso: comprar en la tienda8Código reutilizable
Métodos de extensiónUn singleton genéricoFunciones auxiliares genéricasRepaso: FindNearest11Desafíos finales
Defensa de torres básicaMesa de fabricaciónRecetas de fabricaciónCombate contra el jefe3Eventos
Eventos de C# en UnitySuscribirse en OnEnableCampos UnityEventLos eventos controlan la interfazRepaso: ventana emergente de logrosRepaso: temporizador de la ventana emergentePractica por tu cuenta: Playground de Unity