Gel
Leçon 15 sur 18 du cours Jeu Unity : défense de tours de Coddy.
La tour de givre fait à peine mal, mais ses éclats ralentissent un ennemi pendant un certain temps. Le ralentissement est un état propre à un ennemi et il a une fin : l’ennemi conserve le facteur et l’instant où le ralentissement prend fin, puis calcule sa vitesse à chaque image à partir de la vitesse de son asset. Tant que Time.time est antérieur à la fin, le facteur s’applique ; ensuite, l’ennemi retrouve sa vitesse maximale et rien n’a besoin d’annuler quoi que ce soit. Une voiture de course sur une rampe d’accélération :
public void Boost(float multiplier, float seconds)
{
boost = multiplier;
boostUntil = Time.time + seconds;
}float speed = data.topSpeed;
if (Time.time < boostUntil)
{
speed *= boost;
}Le ralentissement ne doit jamais être inscrit dans l’asset. data.speed *= 0.5f ralentirait tous les ennemis de ce type, y compris ceux qui ne sont pas encore apparus, et rien ne rétablirait jamais leur vitesse. Si un deuxième éclat touche un ennemi déjà ralenti, le facteur et l’instant de fin sont définis à nouveau : le ralentissement dure donc tant que la tour de givre continue de toucher l’ennemi, sans devenir plus puissant.
Défi
Moyen- Dans
TowerData, ajoutez les nombres à virgule flottante publicsslowFactor(valeur par défaut : 1, aucun ralentissement) etslowDuration(valeur par défaut : 0). FrostData définit ces valeurs à 0.5 et 2. - Dans
Enemy, ajoutezpublic void Slow(float factor, float duration), qui mémorise le facteur et le moment où le ralentissement prend fin. À chaque image, l’ennemi se déplace à la vitesse de son asset, multipliée par le facteur tant que le ralentissement dure. - Dans
Projectile, après les dégâts, sislowDurationdes données est supérieur à 0 et que la cible est un Enemy, ralentissez-la avec le facteur et la durée des données.
La tour Frost est dans la boutique, avec son asset FrostData et son projectile FrostShard. Appuyez sur Play, placez une tour Frost devant vos Arrows, puis cliquez sur Check.
Essayez vous-même
using System;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour, IDamageable
{
public static readonly List<Enemy> All = new List<Enemy>();
public static event Action<Enemy> ReachedBase;
public static event Action<Enemy> Killed;
public EnemyData data;
public Transform[] waypoints;
private int next = 1;
private int health;
void Awake()
{
health = data.maxHealth;
}
void OnEnable()
{
All.Add(this);
}
void OnDisable()
{
All.Remove(this);
}
void Update()
{
Vector3 target = waypoints[next].position;
transform.position = Vector3.MoveTowards(transform.position, target, data.speed * Time.deltaTime);
if (transform.position == target)
{
next++;
if (next == waypoints.Length)
{
ReachedBase?.Invoke(this);
Destroy(gameObject);
}
}
}
public void TakeDamage(int amount)
{
if (health <= 0)
{
return;
}
health -= amount;
if (health <= 0)
{
Killed?.Invoke(this);
Destroy(gameObject);
}
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.