Ігри в стилі Tower Defense неймовірно популярні і не дивно, що немає нічого більш захоплюючого, ніж спостереження за вашим захистом, яка знищує злих загарбників!
У цьому підручнику ми створимо неприступну оборону з монстрів (виконують роль веж) в Unity! Ви дізнаєтеся, як.
- Створити хвилі ворогів і навчити їх слідувати за подорожнім точкам (вейпоінтам).
- Створити і модернізувати монстрів і з їх допомогою подрібнювати ворогів на пікселі.
Зрештою, ви отримаєте фреймворк для цього ігрового жанру, який в подальшому зможете вдосконалити!
Ви повинні знати основи Unity, наприклад, як додати ігрові Ассет і компоненти, розуміти, що таке префаб і знати основних зас C #.
Я використовую версію OS X версію Unity, але ви можете і працювати і під Windows.
Опис 2D гри на Unity в стилі Tower Defense
У цьому підручнику ви побудуєте оборону з веж від ворогів (маленьких жучків), повзучих до печива, яке належить вам і вашим Міньйон-монстрам! Ви можете розмістити монстрів в стратегічно важливих точках і проапгредіть їх за золото.
Гравець повинен вбити комашок перш ніж вони почнуть бенкетувати на печиво, причому кожну нову хвилю ворогів важче перемогти. Гра закінчується коли вам вдалося пережити всі атаки (Перемога!), Або коли п'ять ворогів досягнутий печива (Поразка!). Ось скріншот готової гри:
Гра в стилі Tower Defense на Unity. Захистіть печиво!Початок роботи з Unity
Якщо ви ще не встановили Unity 5, або новішу версію, завантажте її з офіційного сайту Unity. Крім того, скачайте цей стартовий проект. розархівуйте і відкрийте проект TowerDefense-Part1-Starter в Unity.
Стартовий проект включає в себе зображення і звукові Ассет, а також заготовки анімації і кілька корисних скриптів. Скрипти не належать безпосередньо до ігор такого плану, тому вони не будуть описані тут. Також цей проект містить префаб, які в подальшому вам знадобляться для створення персонажів гри. І, нарешті, проект включає в себе сцену з фоном і призначений для користувача інтерфейс.
Відкрийте GameScene. знайдену в папці Scenes. і виберіть співвідношення сторін 4: 3. щоб все вміщувалося на екрані. Ви повинні побачити наступне у вкладці Game view:
Працюємо з монстрами
Монстри можуть бути розміщені тільки на місцях, зазначених x. Для того, щоб додати їх на сцену, перетягніть Images \ Objects \ Openspot з Project Browser на вкладку Scene (Сцена). На даний момент, стан не має значення.
Виберіть в ієрархії Openspot. потім додайте компонент, натиснувши на Add Component в Інспектора і виберіть Physics 2D \ Box Collider 2D. Unity відобразить бокс-коллайдер із зеленою лінією на вкладці Сцена. Ви будете використовувати цей коллайдер для виявлення клацань миші на цьому місці.
Unity автоматично визначає відповідний розмір для коллайдера. Круто?Тепер додайте компонент Audio \ Audio Source в Openspot. Встановіть джерела звуку AudioClip в tower_place. які ви можете знайти в папці Audio і відключіть Play On Awake.
Вам потрібно створити ще 11 місць. Незважаючи на спокусу зробити ці кроки знову, Unity має більш елегантне рішення: префаб!
Перетягніть Openspot з ієрархії в папку Prefabs в Project Browser (браузері проекту). Його ім'я стане синім в ієрархії, щоб показати, що він підключений до префаб:
Тепер, коли у вас є префаб, ви можете створити стільки копій, скільки вам потрібно. Просто перетягніть Openspot з папки Prefabs в браузері проекту у вкладку Сцена. Проробіть це 11 разів, щоб на сцені було 12 об'єктів Openspot.
Тепер використовуйте Інспектор, щоб встановити положення цих 12 об'єктів в наступні позиції: (-5.2, 3.5, 0). (-2.2, 3.5, 0). (0.8, 3.5, 0). (3.8, 3.5, 0). (-3.8, 0.4, 0). (-0.8, 0.4, 0). (2.2, 0.4, 0). (5.2, 0.4, 0). (-5.2, -3.0, 0). (-2.2, -3.0, 0). (0.8, -3.0, 0). (3.8, -3.0, 0).
Коли ви закінчите, ваша сцена повинна виглядати наступним чином:
розміщуємо монстрів
Для зручності, в папці Prefab є префаб Monster.
Префаб монстра, готовий до використання
На даний момент вона складається з порожнього ігрового об'єкта з трьома різними спрайтами і їх анімацій як подоб'ектов.
Кожен спрайт є монстром з різним рівнем потужності. Префаб також містить компонент Audio Source. який ви будете запускати для відтворення звуку, коли монстр стріляє лазером.
Створимо скрипт, який може помістити Monster на Openspot.
У браузері проекту виберіть Openspot в папці Prefabs. У Інспектора натисніть на Add Component (Додати Компонент), потім виберіть New Script (Новий Скрипт) і назвіть його PlaceMonster. Виберіть C Sharp як Language і натисніть на Create and Add (Створити і Додати). Оскільки Щоб зробити скрипт в префаб Openspot все Openspot'и будуть також містити цей скрипт.
Двічі клацніть по скрипту, щоб відкрити його в MonoDevelop. Потім додайте ці дві змінні:
Ви створите копію об'єкта, що зберігається в monsterPrefab. щоб створити монстра і зберігати його в monster для управління ним під час гри.
Один монстр на локацію
Додайте наступний метод, щоб в кожній локації був тільки один монстр:
У canPlaceMonster () можна перевірити, чи є змінна monster порожній (null). Якщо все ще так, то значить, що монстра немає, і можна розмістити ще одного.
Тепер додайте наступні рядки, завдяки яким монстр буде з'являтися, коли користувач буде натискати на цей ігровий об'єкт:
Цей код поміщає монстра по клацанню миші або торкання екрана. Так, як це працює?
- Unity автоматично викликає OnMouseUp коли гравець натискає на фізичний коллайдер ігрового об'єкта.
- При виклику цей метод поміщає нового монстра, якщо canPlaceMonster () повертає true.
- Монстра можна створити за допомогою методу Instantiate. який створює зразок префаб з певною позицією та обертанням. В такому випадку можна скопіювати monsterPrefab. застосувати до нього поточну позицію і обертання ігрового об'єкта, прикріпити результат до GameObject і зберегти його в monster.
- І, нарешті, ви викликаєте PlayOneShot. щоб програти звуковий ефект прив'язаний до компоненту об'єкта AudioSource.
Тепер ваш скрипт PlaceMonster може помістити нового монстра, але вам все ще потрібно позначити префаб.
Використання потрібного префаб
Збережіть файл і переключіться назад в Unity. Для того, щоб призначити змінну monsterPrefab спершу виберіть Openspot в папці Prefabs в браузері проекту. У Інспектора клікніть на гурток праворуч від компонента PlaceMonster (Script) в поле Monster Prefab і виберіть Monster в діалоговому вікні.
Запустіть сцену і створюйте монстрів в різних точках, позначених х. за допомогою клацання або торкання екрана.
Тепер Ви можете створювати монстрів. Проте вони схожі на дивну кашу, тому що всі дочірні спрайт монстрів намальовані. Ми виправимо це пізніше.Прокачування монстрів в Unity-грі
На малюнку нижче ви бачите, як ваші монстри виглядають все більш жахливими на більш високих рівнях.
Який милашка! Але, якщо ви спробуєте вкрасти печиво, цей монстр може перетворитися на вбивцю.Скрипт служить основою для застосування системи рівнів монстрів. Він відстежує наскільки сильний монстр повинен бути на кожному рівні, і, звичайно ж, нинішній рівень монстра. Додайте цей скрипт.
Виберіть Prefabs / Monster в браузері проекту. Додайте новий C # -скріпт по імені MonsterData. Відкрийте його в MonoDevelop і додайте наступний код перед класом MonsterData.
Ми створили клас MonsterLevel. У ньому зберігається вартість (в золоті, яке ми пропишемо пізніше) і зовнішній вигляд різних типів монстрів.
Щоб об'єкти можна було редагувати в інспектора, додайте рядок [System.Serializable] на самий верх класу. Це дозволяє швидко змінити все значення в класі Level - навіть тоді, коли гра запущена. Це неймовірно корисно для додання збалансованості вашій грі.
Визначення рівня монстра
У цьому випадку, ви будете зберігати зумовлений MonsterLevel в List
Чому б просто не використовувати MonsterLevel []. Хоча б тому, що нам знадобляться індекси об'єктів MonsterLevel кілька разів. Код для цього написати не так і складно, тому, ви будете використовувати IndexOf (). який реалізує функціональні можливості для Lists. Немає ніякої необхідності винаходити колесо. ]
У самому верху MonsterData.cs. додайте оператор using:
Це дає вам доступ до загальних структурам даних, так що ви можете використовувати клас List
Generic-функції є великою частиною C #. З їх допомогою можна визначати структури тіпобезопасних даних без звернення до їх типу. Це дуже зручно для класів на кшталт list і set.
Тепер додайте наступну змінну MonsterData для зберігання списку MonsterLevel:
За допомогою generic-функцій можна впевнитися, що levels List може містити тільки об'єкти MonsterLevel. Збережіть файл і переключіться в Unity для настройки кожного рівня монстра. Виберіть Prefabs / Monster в браузері проекту. У Інспектора ви можете побачити папку Levels в компоненті MonsterData (Script). Встановіть size в 3.
Потім встановіть cost для кожного рівня:
Тепер привласнити значення дя поля visualization. У вікні проектів розгорніть папку Prefabs / Monster. щоб побачити папки. Перетягніть Monster0 в поле visualization елемента Element 0.
Повторимо те ж саме для присвоєння Monster1 до Element 1. а Monster2 до Element 2. GIF-картинка, розміщена нижче, наочно демонструє цей процес:
Коли ви вибираєте Prefabs / Monster. префаб повинен виглядати наступним чином:
Визначення рівнів монстрів в ІнспектораВизначення поточного рівня
Перейдіть назад на MonsterData.cs в MonoDevelop і додайте ще одну змінну MonsterData.
У приватній змінної currentLevel у нас буде записаний ... секундочку ... поточний рівень монстра. Не очікували. ]
Зовсім трохи C #, чи не так? Ось, що ми тут робимо:
- Визначаємо властивість для приватної змінної currentLevel. Коли властивість визначено, можна його викликати як будь-яку змінну: або як CurrentLevel (зсередини класу), або як monster.CurrentLevel (ззовні). Можна задати поведінку в Геттера і сеттерів властивості. Використовуючи тільки геттер, тільки сетер, або використовуючи їх обидва, можна робити властивість доступним тільки для читання, тільки для запису, або доступним для обох цих дій.
- У Геттера, ви повертає значення currentLevel.
- У сетера ви призначаєте нового значення currentLevel. Далі ви отримаєте індекс поточного рівня. Нарешті, ви перебирає все levels і встановити візуалізацію в активному або неактивному стані, в залежності від currentLevelIndex. Це здорово, тому що це означає, що всякий раз, коли хтось встановлює currentLevel. спрайт оновлюється автоматично. Властивості тут дуже прігождаются!
Додайте наступне в OnEnable:
Тут встановлюємо CurrentLevel при розміщенні, переконавшись в тому, що він показує тільки потрібний спрайт.
Дуже важливо ініціювати властивість OnEnable замість OnStart. тому що методи викликаються, коли створені префаб.
OnEnable буде викликатися відразу при створенні префаб (якщо префаб був збережений у включеному стані), але OnStart не викликається до тих пір, поки об'єкт не запущений.
Вам потрібно перевірити ці дані, перш ніж розмістити монстра, для цього запускаємо OnEnable.
Збережіть файл і переключіться на Unity. Запустіть проект і розставте монстрів. Тепер вони показують правильно.
апгрейд монстрів
Поверніться в MonoDevelop і додайте наступний метод в MonsterData:
У getNextLevel ви отримуєте індекс currentLevel і індекс максимального рівня. Якщо монстр ще не повністю прокатаю, повертаємо індекс наступного уровеня, в іншому випадку - null.
Ви можете використовувати цей метод, щоб з'ясувати чи можливий апгрейд монстра. Додайте наступний метод для підвищення рівня монстра:
Тут ви отримуєте індекс поточного рівня і перевіряєте менше він levels.Count - 1. Якщо так, - монстра ще можна прокачати, тому ми присвоюємо CurrentLevel наступний рівень.
Тестування можливості апгрейда
Збережіть файл, а потім перейдіть на PlaceMonster.cs в MonoDevelop і додайте цей новий метод:
Тут ми дивимося, чи є монстр, якого можна модернізувати, шляхом перевірки змінної monster на null. Якщо це так, то отримуємо поточний рівень монстра з MonsterData. Після цього ми перевіряємо наявність певної вищий рівень, який при getNextLevel () не повертає null. Якщо "прокачування" монстра можлива, повертаємо true. в іншому випадку - false.
Включити апгрейд за допомогою золота
Щоб включити опцію апгрейда, додайте оператор else if до OnMouseUp:
Перевірте, чи є апгрейд можливий за допомогою canUpgradeMonster (). Якщо так, то ви отримуєте доступ до компоненту MonsterData з GetComponent () і викликаєте increaseLevel (). що підвищує рівень монстра. Нарешті, ви запускаєте звук для монстра AudioSource. Збережіть файл і поверніться назад в Unity. Запустіть гру, розставте і модернізуйте якомога більше монстрів. поки це можливо.
Етапи апгрейда монстра в UnityНа наступному занятті по Tower Defense на Unity ми введемо в гру ігрову валюту, попрацюємо на маршрутом для монстрів і ін.
- unity