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.
Défi
MoyenIDamageabledéclarevoid TakeDamage(int amount). Fais implémenter cette interface parEnemy: 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.- Dans
Projectile, ajoute un float sérialiséspeed(le prefab définit sa valeur à 12) etpublic void Launch(Transform target, int damage), qui mémorise les deux. DansUpdate, fais avancer le projectile vers la cible à la vitessespeed; à l’arrivée, appelleTakeDamage(damage)sur son IDamageable et détruis le projectile. Lorsque la cible a disparu, détruis le projectile. - Dans
Tower, ajoute un int publicdamage, un float publicfireRate(tirs par seconde) et unprojectilePrefabsérialisé (un Projectile). Tant que la tour a une cible, tire au maximumfireRatefois 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
{
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.