Menu
CoddyTech

Лёгкая версия Tower Defense

Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 61 из 64.

Ползущие враги движутся по дороге к вашей базе, а её защищает одна башня. Башня стреляет снарядами по ближайшему к ней врагу, пока тот находится в радиусе досягаемости, а за каждого уничтоженного врага вы получаете золото. Нажмите пробел, чтобы потратить золото на следующий уровень башни: с каждым уровнем увеличивается дальность стрельбы, скорость стрельбы или сила удара. Враг, добравшийся до базы, проходит дальше. Уровни — это игровые данные, которые дизайнер настраивает в ресурсе, не изменяя код. Башня стреляет множеством снарядов, поэтому повторно использует их из пула вместо того, чтобы создавать и уничтожать снаряд после каждого выстрела.

Напишите два скрипта: TowerData — тип ресурса — и Tower. Скрипты Creep, Bolt и CreepSpawner уже готовы, как и методы Nearest и Show башни.

challenge icon

Задание

Сложно

Доработай башню; Nearest(range) и Show() готовы.

  1. TowerLevel: сериализуемый класс с общедоступными полями range, fireEvery, damage, cost. TowerData содержит public List<TowerLevel> levels.
  2. Каждые fireEvery секунд, если Nearest(range) находит крипа, создай болт из ObjectPool<Bolt> в позиции башни: bolt.Launch(creep, damage, pool.Release).
  3. Вызывай Show() после Creep.Killed, чтобы начислить bounty, и после нажатия клавиши Space, чтобы купить следующий уровень за его cost, записывая в журнал Tower level 2.

Нажми «Играть» и улучши башню. Затем нажми «Проверить».

Попробуйте сами

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;

    // Готово: ближайший к башне крип в пределах радиуса действия или 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;
    }

    // Готово: показывает уровень и количество золота в формате Level 1, 0 gold.
    void Show()
    {
        infoText.text = "Level " + (level + 1) + ", " + gold + " gold";
    }
}

Все уроки раздела Архитектура игр в Unity

Потренируйтесь самостоятельно: Песочница Unity