Облегчённая защита башни
Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 48 из 50.
Крипы движутся по дороге к вашей базе, а её защищает одна башня. Башня стреляет болтами по ближайшему к ней крипу, пока тот находится в радиусе действия, и за каждого поверженного крипа вы получаете золото. Нажмите пробел, чтобы потратить золото на следующий уровень башни: с каждым уровнем она достаёт дальше, стреляет быстрее или наносит больше урона. Если крип доберётся до базы, он прорвётся. Уровни — это игровые данные, которые дизайнер настраивает в ресурсе, не затрагивая код. Башня стреляет множеством болтов, поэтому повторно использует их из пула, а не создаёт и уничтожает по одному для каждого выстрела.
Напишите два скрипта: TowerData — тип ресурса, и Tower. Скрипты Creep, Bolt и CreepSpawner уже готовы.
Задание
СложноInspector задаёт Tower data (ресурс Arrow), boltPrefab и infoText. Считывай нажатие Space через Keyboard.current из Input System.
- В
TowerData.cs: классTowerLevel, который Inspector может отображать, с полямиpublic float range,public float fireEvery,public int damageиpublic int cost(стоимость достижения этого уровня), иTowerData— ScriptableObject с пунктом в меню Create и полемpublic List<TowerLevel> levels. Ресурс Arrow содержит три уровня: дальность 4, интервал 1 с, урон 1, стоимость 0; дальность 5, интервал 0.6 с, урон 1, стоимость 6; дальность 6, интервал 0.4 с, урон 2, стоимость 12. - Башня начинает с первого уровня и 0 золота, а
infoTextпоказывает оба значения в видеLevel 1, 0 goldпри каждом их изменении. - Когда с последнего выстрела проходит указанное в
fireEveryколичество секунд и в радиусе действия есть крип (коллайдер крипа находится в пределахrangeот башни, как обнаруживаетPhysics.OverlapSphere), башня стреляет в ближайшего к ней крипа. Она берёт болт изObjectPool<Bolt>, помещает его у башни и вызываетbolt.Launch(creep, damage, pool.Release): когда болт заканчивает работу, он вызывает последний аргумент, который возвращает болт в пул. Пока болт ждёт в пуле, он деактивирован и активируется, когда его забирают. - За каждого погибшего крипа начисляется его
bountyв золоте: подпишись на статическое событиеCreep.Killed. - Нажатие Space покупает следующий уровень, если он есть и золота хватает на его
cost: стоимость вычитается из золота, а башня переходит на следующий уровень и выводит сообщениеTower level 2. В противном случае нажатие Space ничего не делает.
Нажми Play, удерживай дорогу и улучшай башню, затем нажми Check.
Попробуйте сами
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;
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Архитектура игр в Unity
1Компоненты, а не иерархии
Небольшие компонентыБазовый скрипт врагаАбстрактные компонентыСовместная работа компонентовПовторение: модульная турель4Сериализованные данные
Сериализуемые классыСписки в InspectorПеречисления в InspectorПовторение: таблица лута2Интерфейсы в Unity
IDamageableИнтерфейсы и TryGetComponentGetComponentsПовторение: клавиша взаимодействия5ScriptableObjects
Ресурсы данныхХарактеристики оружияОбщие настройкиВолны как данныеПовторение: база предметов