Disparar
Lección 9 de 18 del curso Juego de Unity: defensa de torres de Coddy.
Una torre dispara a su objetivo fireRate veces por segundo. En lugar de usar un temporizador que cuenta hacia atrás, la torre guarda la hora de su próximo disparo: cuando Time.time la alcanza, la torre dispara y la adelanta 1f / fireRate segundos. Un aspersor que rocía dos veces por segundo:
if (Time.time >= nextSpray)
{
Spray();
nextSpray = Time.time + 1f / spraysPerSecond;
}Cada disparo es un Projectile que vuela hacia su objetivo con MoveTowards, siguiéndolo mientras camina, y lo daña al llegar. No necesita saber que ha alcanzado a un Enemy: le solicita al objetivo IDamageable, la interfaz para cualquier cosa que pueda recibir daño, como en el capítulo sobre interfaces, así que se puede disparar a cualquier cosa que la implemente.
Un objetivo puede morir mientras un disparo está en el aire, abatido por el disparo de otra torre. Entonces, el target del disparo es igual a null, como ocurre con todo objeto de Unity destruido, y el disparo ya no tiene adónde volar, así que se destruye.
Desafío
IntermedioIDamageabledeclaravoid TakeDamage(int amount). Haz queEnemylo implemente: la cantidad se resta de su salud y, cuando llega a 0 o menos, se destruye al enemigo.- En
Projectile, añade un float serializadospeed(el prefab establece 12) ypublic void Launch(Transform target, int damage), que guarda ambos. EnUpdate, vuela hacia el objetivo aspeed; al llegar, llama aTakeDamage(damage)en su IDamageable y destruye el proyectil. Cuando el objetivo ya no esté, destruye el proyectil. - En
Tower, añade un int públicodamage, un float públicofireRate(disparos por segundo) y unprojectilePrefabserializado (un Projectile). Mientras la torre tenga un objetivo, dispara como máximofireRateveces por segundo: instancia el proyectil un poco por delante de la cabeza, enhead.position + head.forward * 0.6f, y lánzalo al objetivo con el daño de la torre.
El prefab ArrowTower establece un daño de 2 y un fireRate de 1.5, y su proyectil es ArrowShot. Pulsa Play, construye torres y detén la primera oleada; después, pulsa Check.
Pruébalo tú mismo
using UnityEngine;
// Se añadirá más adelante: un proyectil que vuela desde una torre hasta su objetivo.
public class Projectile : MonoBehaviour
{
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.