Menu
CoddyTech

Tirer

Leçon 9 sur 18 du cours Jeu Unity : défense de tours de Coddy.

Une tour tire sur sa cible fireRate fois par seconde. Plutôt que d’utiliser un minuteur qui décompte, la tour mémorise l’heure de son prochain tir : lorsque Time.time l’a atteinte, la tour tire et la décale de 1f / fireRate secondes. Un arroseur qui projette de l’eau deux fois par seconde :

if (Time.time >= nextSpray)
{
    Spray();
    nextSpray = Time.time + 1f / spraysPerSecond;
}

Chaque tir est un Projectile qui vole vers sa cible avec MoveTowards, la suit pendant qu’elle se déplace et lui inflige des dégâts à son arrivée. Il n’a pas besoin de savoir qu’il a touché un Enemy : il demande à la cible si elle possède IDamageable, l’interface pour tout ce qui peut subir des dégâts, comme dans le chapitre sur les interfaces. Ainsi, tout ce qui l’implémente peut être touché.

Une cible peut mourir pendant qu’un tir est en vol, abattue par le tir d’une autre tour. Le target du tir est alors égal à null, comme c’est le cas pour tout objet Unity détruit, et le tir n’a plus rien à atteindre : il se détruit donc lui-même.

challenge icon

Défi

Moyen
  1. IDamageable déclare void TakeDamage(int amount). Fais implémenter cette interface par Enemy : la quantité est déduite de ses points de vie, et si ceux-ci sont inférieurs ou égaux à 0, l’ennemi est détruit.
  2. Dans Projectile, ajoute un float sérialisé speed (le prefab définit sa valeur à 12) et public void Launch(Transform target, int damage), qui mémorise les deux. Dans Update, fais avancer le projectile vers la cible à la vitesse speed ; à l’arrivée, appelle TakeDamage(damage) sur son IDamageable et détruis le projectile. Lorsque la cible a disparu, détruis le projectile.
  3. Dans Tower, ajoute un int public damage, un float public fireRate (tirs par seconde) et un projectilePrefab sérialisé (un Projectile). Tant que la tour a une cible, tire au maximum fireRate fois par seconde : instancie le projectile un peu devant la tête, à head.position + head.forward * 0.6f, et lance-le vers la cible en lui infligeant les dégâts de la tour.

Le prefab ArrowTower définit une valeur de damage de 2 et une valeur de fireRate de 1.5, et son projectile est ArrowShot. Appuie sur Play, construis des tours et arrête la première vague, puis clique sur Check.

Essayez vous-même

using UnityEngine;

// À venir : un projectile qui vole d'une tour vers sa cible.
public class Projectile : MonoBehaviour
{
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Jeu Unity : défense de tours