Menu
CoddyTech

Defesa de Torre Lite

Parte da seção Arquitetura de Jogos no Unity do Journey de Unity da Coddy. Lição 61 de 64.

Os creeps marcham pela estrada em direção à sua base, e uma única torre a protege. A torre dispara projéteis contra o creep mais próximo enquanto ele estiver ao alcance, e cada creep que ela derruba rende ouro. A tecla Espaço gasta o ouro no próximo nível da torre: cada nível aumenta o alcance, a velocidade dos disparos ou o dano. Um creep que chega à base consegue passar. Os níveis são dados do jogo que um designer ajusta em um asset, sem tocar no código, e a torre dispara muitos projéteis, então ela os reutiliza de um conjunto, em vez de criar e destruir um a cada disparo.

Escreva dois scripts: TowerData, o tipo de asset, e Tower. Creep, Bolt e CreepSpawner já estão prontos, assim como Nearest e Show da torre.

challenge icon

Desafio

Difícil

Finalize a torre; Nearest(range) e Show() estão prontos.

  1. TowerLevel: serializável, range, fireEvery, damage e cost públicos. TowerData contém public List<TowerLevel> levels.
  2. A cada fireEvery segundos, se Nearest(range) encontrar um creep, coloque um projétil de um ObjectPool<Bolt> na torre: bolt.Launch(creep, damage, pool.Release).
  3. Use Show() depois que Creep.Killed pagar bounty e depois que a barra de espaço comprar o próximo nível por seu cost, registrando Tower level 2.

Pressione “Jogar” e aprimore a torre. Depois, “Verificar”.

Experimente você mesmo

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: o creep mais próximo da torre dentro do alcance, 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;
    }

    // Pronto: mostra o nível e o ouro, como em Level 1, 0 gold.
    void Show()
    {
        infoText.text = "Level " + (level + 1) + ", " + gold + " gold";
    }
}

Todas as lições de Arquitetura de Jogos no Unity

Pratique por conta própria: Playground de Unity