Лёгкая версия Tower Defense
Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 61 из 64.
Ползущие враги движутся по дороге к вашей базе, а её защищает одна башня. Башня стреляет снарядами по ближайшему к ней врагу, пока тот находится в радиусе досягаемости, а за каждого уничтоженного врага вы получаете золото. Нажмите пробел, чтобы потратить золото на следующий уровень башни: с каждым уровнем увеличивается дальность стрельбы, скорость стрельбы или сила удара. Враг, добравшийся до базы, проходит дальше. Уровни — это игровые данные, которые дизайнер настраивает в ресурсе, не изменяя код. Башня стреляет множеством снарядов, поэтому повторно использует их из пула вместо того, чтобы создавать и уничтожать снаряд после каждого выстрела.
Напишите два скрипта: TowerData — тип ресурса — и Tower. Скрипты Creep, Bolt и CreepSpawner уже готовы, как и методы Nearest и Show башни.
Задание
СложноДоработай башню; Nearest(range) и Show() готовы.
TowerLevel: сериализуемый класс с общедоступными полямиrange,fireEvery,damage,cost.TowerDataсодержитpublic List<TowerLevel> levels.- Каждые
fireEveryсекунд, еслиNearest(range)находит крипа, создай болт изObjectPool<Bolt>в позиции башни:bolt.Launch(creep, damage, pool.Release). - Вызывай
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
1Компоненты, а не иерархии
Небольшие компонентыБазовый скрипт врагаАбстрактные компонентыКомпоненты работают вместеПовторение: модульная турельПовторение: спаренная пушка4Сериализованные данные
Сериализуемые классыСписки в инспектореПеречисления в инспектореПовторение: таблица добычиПовторение: определяем добычу2Интерфейсы в Unity
IDamageableИнтерфейсы и TryGetComponentGetComponentsПовторение: клавиша взаимодействияПовторение: ближайший в пределах досягаемости5ScriptableObjects
Ресурсы данныхХарактеристики оружияОбщие настройкиСохраняем ветерВолны как данныеПовторение: база предметовПовторение: покупка в магазинеПотренируйтесь самостоятельно: Песочница Unity