Défense de tour simplifiée
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 61 sur 64.
Les creeps avancent sur la route en direction de ta base, qu’une seule tour défend. La tour tire des projectiles sur le creep le plus proche tant qu’il y en a un à portée, et chaque creep qu’elle élimine rapporte de l’or. La touche Espace dépense cet or pour acheter le niveau suivant de la tour : chaque niveau augmente sa portée, sa cadence de tir ou sa puissance. Un creep qui atteint la base passe. Les niveaux sont des données de jeu qu’un concepteur ajuste dans un asset, sans toucher au code. La tour tire beaucoup de projectiles, alors elle les réutilise à partir d’un pool au lieu d’en créer puis d’en détruire un à chaque tir.
Écris deux scripts : TowerData, le type d’asset, et Tower. Creep, Bolt et CreepSpawner sont prêts, tout comme Nearest et Show de la tour.
Défi
DifficileTermine la tour ; Nearest(range) et Show() sont prêts.
TowerLevel: sérialisable, avec les champs publicsrange,fireEvery,damage,cost.TowerDatacontientpublic List<TowerLevel> levels.- Toutes les
fireEverysecondes, siNearest(range)trouve un creep, place un projectile provenant d’unObjectPool<Bolt>à la tour :bolt.Launch(creep, damage, pool.Release). - Appelle
Show()après queCreep.Killedverse labounty, et après avoir appuyé sur Espace pour acheter le niveau suivant au prix de soncost, en affichantTower level 2dans le journal.
Appuie sur Jouer et améliore la tour. Puis clique sur Vérifier.
Essayez vous-même
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Pool;
using TMPro;
public class Tower : MonoBehaviour
{
[SerializeField] private TowerData data;
[SerializeField] private Bolt boltPrefab;
[SerializeField] private TMP_Text infoText;
private int level;
private int gold;
// Prêt : le creep le plus proche de la tour à portée, ou null.
Creep Nearest(float range)
{
Creep nearest = null;
float best = Mathf.Infinity;
foreach (Collider hit in Physics.OverlapSphere(transform.position, range))
{
if (hit.TryGetComponent(out Creep creep))
{
float distance = Vector3.Distance(transform.position, creep.transform.position);
if (distance < best)
{
best = distance;
nearest = creep;
}
}
}
return nearest;
}
// Prêt : affiche le niveau et l’or, sous la forme Level 1, 0 gold.
void Show()
{
infoText.text = "Level " + (level + 1) + ", " + gold + " gold";
}
}
Toutes les leçons de Architecture de jeu dans Unity
1Des composants, pas des hiérarchies
De petits composantsUn script de base pour les ennemisComposants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaireRécapitulatif : canon double4Données sérialisées
Classes sérialisablesListes dans l’InspecteurÉnumérations dans l’InspecteurRécapitulatif : table de butinRécapitulatif : tirer le butin2Les interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interactionLe plus proche à portée5ScriptableObjects
Ressources de donnéesStatistiques des armesParamètres partagésSauver le ventLes vagues comme donnéesRécapitulatif : base de données des objetsRécapitulatif : acheter dans la boutique3Événements
Les événements C# dans UnityS’abonner dans OnEnableChamps UnityEventLes événements pilotent l’interfaceRécapitulatif : fenêtre de succèsRécapitulatif : minuteur de la fenêtreEntraînez-vous par vous-même : Playground Unity