Gel
Leçon 21 sur 25 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
MoyenLes éclats de givre ralentissent les ennemis pendant un certain temps.
- Dans
TowerData, ajoutepublic float slowFactor = 1f;etpublic float slowDuration;(FrostData : 0.5 et 2). - Dans
Enemy,public void Slow(float factor, float duration)conserve le facteur etslowUntil = Time.time + duration; avance àdata.speedmultiplié par le facteur tant queTime.time < slowUntil. - Dans
Projectile, après les dégâts, lorsquedata.slowDuration > 0et que la cible est unEnemy, ralentis-la.
Appuie sur « Jouer » avec une tour Frost avant tes Arrows : les Grunts gelés avancent à la moitié de leur vitesse. Puis clique sur « Vérifier ».
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.
Toutes les leçons de Jeu Unity : défense de tours
Entraînez-vous par vous-même : Playground Unity