Menu
CoddyTech

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.

challenge icon

Défi

Difficile

Termine la tour ; Nearest(range) et Show() sont prêts.

  1. TowerLevel : sérialisable, avec les champs publics range, fireEvery, damage, cost. TowerData contient public List<TowerLevel> levels.
  2. Toutes les fireEvery secondes, si Nearest(range) trouve un creep, place un projectile provenant d’un ObjectPool<Bolt> à la tour : bolt.Launch(creep, damage, pool.Release).
  3. Appelle Show() après que Creep.Killed verse la bounty, et après avoir appuyé sur Espace pour acheter le niveau suivant au prix de son cost, en affichant Tower level 2 dans 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

Entraînez-vous par vous-même : Playground Unity