Menu
CoddyTech

Tower Defense semplificato

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 61 di 64.

I nemici avanzano lungo la strada verso la tua base, che è difesa da una sola torre. La torre spara dardi al nemico più vicino quando è nel raggio d'azione, e ogni nemico che abbatte fa guadagnare oro. Premi Spazio per spendere l'oro e acquistare il livello successivo della torre: ogni livello aumenta la gittata, la velocità di tiro o la potenza dei colpi. Se un nemico raggiunge la base, riesce a passare. I livelli sono dati di gioco che un progettista modifica in una risorsa, senza toccare il codice; inoltre, la torre spara molti dardi, quindi li riutilizza da un pool invece di crearne e distruggerne uno a ogni colpo.

Scrivi due script: TowerData, il tipo di risorsa, e Tower. Creep, Bolt e CreepSpawner sono già pronti, così come Nearest e Show della torre.

challenge icon

Sfida

Difficile

Completa la torre; Nearest(range) e Show() sono pronti.

  1. TowerLevel: serializzabile, con range, fireEvery, damage, cost pubblici. TowerData contiene public List<TowerLevel> levels.
  2. Ogni fireEvery secondi, se Nearest(range) trova un creep, posiziona un proiettile proveniente da un ObjectPool<Bolt> presso la torre: bolt.Launch(creep, damage, pool.Release).
  3. Show() dopo che Creep.Killed paga la bounty e dopo che la barra spaziatrice acquista il livello successivo al suo cost, registrando Tower level 2.

Premi «Gioca» e potenzia la torre. Poi premi «Verifica».

Provalo tu

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;

    // Pronto: il creep più vicino alla torre entro il raggio d'azione, oppure 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;
    }

    // Pronto: mostra il livello e l'oro, nel formato Level 1, 0 gold.
    void Show()
    {
        infoText.text = "Level " + (level + 1) + ", " + gold + " gold";
    }
}

Tutte le lezioni di Architettura dei giochi in Unity

Esercitati da solo: Playground Unity