Zone d'effet
Leçon 20 sur 25 du cours Jeu Unity : défense de tours de Coddy.
L’obus du Canon explose à l’endroit où il atterrit et blesse tous les ennemis proches de l’explosion, pas seulement sa cible. Physics.OverlapSphere(center, radius) renvoie chaque collider situé à moins de radius de center : les ennemis, mais aussi le sol et le chemin. Chaque collider qui possède un IDamageable subit les dégâts. La cible en fait partie, puisque l’obus atterrit dessus ; elle ne doit donc pas être touchée une deuxième fois par son propre obus. Une bombe qui repousse toutes les caisses autour d’elle :
void Explode()
{
foreach (Collider other in Physics.OverlapSphere(transform.position, blastRadius))
{
if (other.TryGetComponent(out Rigidbody body))
{
Vector3 away = (body.position - transform.position).normalized;
body.AddForce(away * push, ForceMode.Impulse);
}
}
}Le rayon d’explosion est une donnée du Canon ; un projectile a donc désormais besoin de plus qu’une valeur de dégâts : Launch prend également le TowerData de la tour. Le rayon d’explosion d’une flèche est de 0, ses tirs continuent donc de toucher uniquement leur cible. Les dégâts restent un argument distinct, car ils dépendent du niveau de la tour.
Une explosion montre au joueur où l’obus a éclaté : une sphère transparente aussi large que le rayon d’explosion, qui disparaît au bout d’un quart de seconde. Destroy(blast, 0.25f) la détruit après ce délai, sans que tu aies à gérer ton propre minuteur.
Défi
MoyenLes obus de canon explosent et blessent tous les ennemis à proximité.
- Dans
TowerData, ajoutepublic float splashRadius;(CannonData définit 1.5).Launchprend un troisième argument,TowerData data, que la tour transmet. - À l’arrivée, si
data.splashRadius > 0, chaque IDamageable dansPhysics.OverlapSphere(transform.position, data.splashRadius)subit les dégâts une fois ; sinon, seule la cible les subit. - Ensuite, affiche à cet endroit un
blastPrefabsérialisé, mis à l’échelle avecVector3.one * data.splashRadius * 2f, puis appelleDestroy(blast, 0.25f).
Appuie sur « Jouer » : une explosion de canon blesse les Grunts regroupés. Ensuite, appuie sur « Vérifier ».
Essayez vous-même
using UnityEngine;
public class Projectile : MonoBehaviour
{
[SerializeField] private float speed = 12f;
private Transform target;
private int damage;
public void Launch(Transform target, int damage)
{
this.target = target;
this.damage = damage;
}
void Update()
{
if (target == null)
{
Destroy(gameObject);
return;
}
transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
if (transform.position == target.position)
{
if (target.TryGetComponent(out IDamageable damageable))
{
damageable.TakeDamage(damage);
}
Destroy(gameObject);
}
}
}
Toutes les leçons de Jeu Unity : défense de tours
Entraînez-vous par vous-même : Playground Unity