Создание Tower Defense на игровом движке Unity 5.
В прошлой части урока мы начали заниматься разработкой своей Tower Defense на Unity5. Подготовили игровую сцену и научили двигаться наших ботов по точкам. В этой части мы добавим в проект башни и заставим их уничтожать противника.
Первым делом необходимо добавить модель самой башни в проект, это может быть любая ваша модель, ну а я добавил вот такую (ее можно скачать здесь).
![]()
После добавления в проект перенесем ее на нашу сцену. Модель башни должна примерно подходить под размеры площадки, созданной на прошлом уроке.

Наша башня состоит из двух частей это башня с пушкой и стойка, на которой башня закреплена, наша задача сделать так, чтобы башня с пушкой вращались отдельно от стойки. Нажимаем на модель и создаем пустой объект, расположен он, должен быть в середине модели в месте соприкосновения стойки с площадкой, немного подымим его по оси Y так, что бы он находился в месте, где башня установлена на стойку. Повернем его по оси Y на -90 градусов так, что бы синяя стрелка была параллельно пушки (для корректного поворота) и делаем объект башни с пушкой дочерним этой пустышки.

Теперь можем проверить, поворачивая пустышку (назовем ее turret_pivot) по оси Y. Как видим, башня крутится, а стойка остается на месте.

Сохраняем нашу модель башни в префаб и удаляем со сцены.
В папке scripts создадим скрипт turret и перенесем его на префаб башни. Откроем скрипт и напишем такие строки кода:
public class turret : MonoBehaviour {
private Transform target;
public float range = 15f;
public string enemyTag = "Enemy";
public Transform partToRotate;
public float turnSpeed = 10f;
void Start () {
InvokeRepeating ("UpdateTarget", 0f, 0.5f);
}
void UpdateTarget(){
GameObject[] enemies = GameObject.FindGameObjectsWithTag (enemyTag);
float shortestDistance = Mathf.Infinity;
GameObject nearestEnemy = null;
foreach (GameObject enemy in enemies) {
float distanceToEnemy = Vector3.Distance (transform.position, enemy.transform.position);
if (distanceToEnemy < shortestDistance) {
shortestDistance = distanceToEnemy;
nearestEnemy = enemy;
}
}
if (nearestEnemy != null && shortestDistance <= range) {
target = nearestEnemy.transform;
} else {
target = null;
}
}
void Update () {
if (target == null)
return;
Vector3 dir = target.position - transform.position;
Quaternion lookRotation = Quaternion.LookRotation(dir);
Vector3 rotation = Quaternion.Lerp(partToRotate.rotation,lookRotation, Time.deltaTime * turnSpeed).eulerAngles;
partToRotate.rotation = Quaternion.Euler (0f, rotation.y, 0f);
}
void OnDrawGizmosSelected(){
Gizmos.color = Color.red;
Gizmos.DrawWireSphere (transform.position, range);
}
}В префабе turret укажем в поле part to rotate нашу пустышку turret_pivot и разместим несколько префабов нашей башни на сцене (копировать ctrl+d, перемещать через ctrl). Сохраним сцену и запустим проект

Как видим наши башни следят за направлением противника.

Реализация стрельбы.
Добавим на сцену сферу, это будет наш патрон, назовем его bullet и подгоним размеры под ствол пушки.

Добавим на него материал и сохраним в префаб.
Изменим префаб нашей пушки, к компоненту turret_pivot добавим пустышку (bulletfire) и разместим ее на конце пушки – из этого объекта будут вылетать наши патроны.

Откроем тот же скрипт turret и продолжим…добавим еще несколько функций, которые будут отвечать за стрельбу. Общий скрипт turret будет выглядеть вот так:
using UnityEngine;
using System.Collections;
public class turret : MonoBehaviour {
private Transform target;
public float range = 15f; // радиус атаки пушки
public string enemyTag = "Enemy"; // тэг для атаки
public Transform partToRotate; //объект поворота
public float turnSpeed = 10f; // скорость поворота башни
public float fireRate= 1f;
private float fireCountdown = 0f;
public GameObject bulletprefab; // объект пули
public Transform firePoint; // объект из которого будет вылетать пуля
void Start () {
InvokeRepeating ("UpdateTarget", 0f, 0.5f);
}
void UpdateTarget(){
GameObject[] enemies = GameObject.FindGameObjectsWithTag (enemyTag); // определяем тэг для нашего противника
float shortestDistance = Mathf.Infinity;
GameObject nearestEnemy = null;
foreach (GameObject enemy in enemies) {
float distanceToEnemy = Vector3.Distance (transform.position, enemy.transform.position);
if (distanceToEnemy < shortestDistance) {
shortestDistance = distanceToEnemy;
nearestEnemy = enemy;
}
}
if (nearestEnemy != null && shortestDistance <= range) {
target = nearestEnemy.transform;
} else {
target = null;
}
}
void Update () {
if (target == null)
return;
// делаем повороты башни в соответствии с позицией противника
Vector3 dir = target.position - transform.position;
Quaternion lookRotation = Quaternion.LookRotation(dir);
Vector3 rotation = Quaternion.Lerp(partToRotate.rotation,lookRotation, Time.deltaTime * turnSpeed).eulerAngles;
partToRotate.rotation = Quaternion.Euler (0f, rotation.y, 0f);
Видео:Создание игры Tower Defense на Unity3D часть 2Скачать
if (fireCountdown <= 0f) { // функция стрельбы по истечению времени
Shoot ();
fireCountdown = 1f / fireRate;
}
fireCountdown -= Time.deltaTime;
}
void Shoot(){ // создаем компонент Bullet в точке стрельбы
GameObject bulletGo = (GameObject)Instantiate (bulletprefab, firePoint.position, firePoint.rotation);
Bullet bullet = bulletGo.GetComponent<Bullet> ();
if (bullet != null)
bullet.Seek (target);
}
void OnDrawGizmosSelected(){
Gizmos.color = Color.red;
Gizmos.DrawWireSphere (transform.position, range);
}
}Создадим еще один скрипт Bullet и поместим его на наш патрон, откроем его и напишем код:
using UnityEngine;
using System.Collections;
public class Bullet : MonoBehaviour {
private Transform target;
public float speed = 70f; // скорость полета пули
public GameObject bulletEffect; // эффект разрушения
public void Seek (Transform _target) {
target = _target;
}
void Update () {
if (target == null) {
Destroy (gameObject);
return;
}
Vector3 dir = target.position - transform.position; // направляем нашу пулю в сторону противника
float distanceThisFrame = speed * Time.deltaTime;
if (dir.magnitude <= distanceThisFrame) {
HitTarget ();
return;
}
transform.Translate (dir.normalized * distanceThisFrame, Space.World);
}
void HitTarget (){ // добавляем эффект разрушения в место столкновения и удаляем все три объекта со сцены
GameObject effectIns= (GameObject) Instantiate(bulletEffect, transform.position, transform. rotation);
Destroy(effectIns, 2f);
Destroy(target.gameObject);
Destroy(gameObject);
}
}Добавим на сцену систему частиц, это будит эффект при попадании нашего патрона в противника. Настроим его примерно вот так:


Для это системы частиц создайте новый материал и примените его в Render — material, так же переименуйте его в bulleteffect и сохраните в префаб. Укажите этот префаб в скрипте bullet на префабе bullet.
Для нашего противника создадим новый тэг «Enemy» и присвоим этот тэг ему.

На префабе башни в bulletprefab перенесем префаб патрона и в fire point перенесем компонент bulletfire (объект из которого будет выходить наш патрон).

Не забывайте сохранять сцену. Проверим что мы тут наработали, запустим игровую сцену.

Видим что при попадании нашего патрона в противника предмет исчезает и появляется наша системы частиц (эффект разрушения), так же башни естественно двигаются за нашими противниками. Урок получился немного сложноватым и могут показаться некоторые моменты не понятными, мы рады будем ответить на ваши вопросы, оставляйте их в комментариях.
На этом вторая часть урока окончена. Желаем удачных проектов!
💡 Видео
Сделал башню лучника и систему строительства в Tower defense на UnityСкачать

Как сделать игру tower defense на unity3D 5: БалистикаСкачать

Unity уроки -Tower Defense часть 2 - Юниты и СпавнСкачать

Сделал игру Защита башни! Создание Tower Defense игры на Unity 1 часть.Скачать

❄️ИГРАЮ РАНДОМНЫМ ЮНИТОМ ИЗ КОРОБОК Toilet Tower DefenseСкачать

✨Я ПОСТРОИЛ *ФЕЙК* ТУАЛЕТ ТОВЕР ДЕФЕНС в ROBLOX STUDIO 🔨 Toilet Tower Defense! **ПЕРВАЯ ЧАСТЬ**Скачать

😱БАГ НА ЮНИТОВ В TOILET TOWER DEFENSE ! **КОДЫ АДМИНА**Скачать

✨ТРЕЙД от BASIC до MYTHIC в Toilet Tower Defense! ЧАСТЬ 2 ROBLOX ТУАЛЕТ ТОВЕР ДЕФЕНС! ПЕРВАЯ ЛЕГА!Скачать

😱 УСПЕЙ! НОВЫЙ АПГРЕЙД ТИТАН СПИКЕРМЕН, НОВЫЕ ТУАЛЕТЫ, НОВЫЕ ЮНИТЫ в Toilet Tower Defense!Скачать

ШОК! ПРОШЕЛ ИГРУ ТОЛЬКО 1 ЮНИТОМ ЗА 5 МИНУТ! 34 СЕРИЯ ROBLOX Toilet Tower DefenseСкачать

✨ УСПЕЙ! НОВЫЙ СЕКРЕТНЫЙ ЮНИТ, 5 БОССОВ В НОВОМ ОБНОВЛЕНИИ в Toilet Tower Defense!Скачать

✨ СРОЧНО! ЭТО БУДЕТ ХАЛЯВОЙ 70 ЭПИЗОДА в TOILET TOWER DEFENSE | ROBLOXСкачать

✨ОБЗОР на ВСЕХ НОВЫХ ЮНИТОВ В НОВОМ ОБНОВЛЕНИЕ в Toilet Tower Defense!Скачать

✨ОБЗОР на ВСЕХ НОВЫХ ЮНИТОВ В НОВОМ ОБНОВЛЕНИЕ в Toilet Tower Defense!Скачать

ПРИТВОРИЛСЯ НУБОМ ЧТОБЫ НАЙТИ СКАМЕРА В TOWER DEFENSE ROBLOXСкачать

Creating a Tower Defense Game Part 5 #gamedev #devlog #indiegamedevlog #unityСкачать

Как Создать Tower Defense Игру в Unity - Эпизод 2 | Tutorial, Unity, C#Скачать










