Кінцевий посібник для початківців з розробки ігор в єдності

Unity - чудовий інструмент для створення прототипів всього, від ігор до інтерактивної візуалізації. У цій статті ми розглянемо все, що вам потрібно знати, щоб розпочати користуватися Unity.

По-перше, трохи про мене: я розробник єдності для любителів, модельєр 3D та графічний дизайнер, який працює з Unity та Blender більше 5 років. Зараз я студент Фінансової математики в Університетському коледжі Дубліна, і іноді займаюся графічним дизайном, веб-прототипуванням та прототипуванням ігор.

Вступ

Ця стаття розрахована на тих, хто ніколи раніше не використовував Unity, але має певний досвід програмування або веб-дизайну / розробки. До кінця цієї статті ви повинні мати хороший загальний огляд движка, а також усі необхідні функції та код, щоб почати створювати базову гру.

Чому Єдність?

Якщо ви хочете робити ігри

Насправді дуже мало варіантів, коли справа стосується розробки Indie Game. Три основні варіанти створення ігор - Unreal, Unity або GameMaker.

Єдність, мабуть, найменш поблажлива з усіх 3 платформ. Це дає вам дуже сирий продукт із коробки, але є дуже гнучким, добре задокументованим та розширюваним для створення майже будь-якого жанру гри, про який ви можете подумати.

Є безліч надзвичайно успішних ігор, таких як Escape from Tarkov (FPS), Monument Valley (Puzzler) та This War of Mine (Strategy / Survival), усі вони побудовані в Unity.

Насправді движок, на якому ви будуєте свою першу гру, напевно, не є критичним, тому моя порада - просто вибрати один і піти з ним.

Якщо ви хочете прототипувати досвід користувачів

Оскільки єдність - це лише двигун з купою фізики, анімації та 3D-рендерінгу в режимі реального часу, це також чудовий простір для створення повноцінних інтерактивних прототипів для досліджень UX.

Unity має повну підтримку VR та AR, а отже, може стати чудовим інструментом для вивчення архітектури, автоматизації та моделювання з клієнтами.

Розділи до цієї статті

  • Чому Єдність?
  • Вікно редактора Unity
  • Об'єкти гри Unity
  • Вбудовані компоненти Unity
  • Створення користувацьких компонентів
  • Структура моно поведінки
  • Маніпулювання об'єктами гри
  • Проміння
  • Виявлення зіткнень
  • Розширені функції
  • Поради для новачків
  • Приємні ресурси та спільноти
  • Висновок

Вікно редактора Unity

Вікно редактора розділено на кілька розділів. Ми розглянемо це дуже коротко, оскільки будемо постійно посилатися на нього у статті. Якщо ваші знайомі з цим вже просто пропустити минуле!

Перегляд сцени: Дозволяє розміщення та переміщення GameObjects у режимі перегляду сцени Game View: попередній перегляд того, як гравець бачитиме сцену з камери. Інспектор: Надайте деталі щодо вибраного GameObject у сцені. Активи / Проект: Тут зберігаються всі збірні файли, текстури, моделі, сценарії тощо. Ієрархія: Дозволяє вкладання та структурування GameObjects всередині сцени

Тепер нам добре розпочати!

Об'єкти гри Unity

Що таке GameObjects

GameObjects - це основний будівельний матеріал усього, що є в ігровому механізмі Unity. Назва майже віддає його:

Все, що ви поміщаєте в сцені в Unity, повинно бути загорнуте в "ігровий об'єкт".

Якщо у вас є досвід веб-дизайну, ви можете вважати GameObjects схожими на елементи! Надзвичайно нудні контейнери, але дуже розширювані для створення складної функціональності або візуалізації.

Буквально все - від ефектів частинок, камер, програвачів, елементів інтерфейсу… (список можна продовжувати) - це GameObject.

Створення ієрархії

Як і у веб-розробці, GameObject також є контейнером. Подібно до того, як ви гніздитесь, щоб створювати різноманітні та бажані макети або абстракції, ви можете зробити те саме з ігровими об'єктами.

Логіка вкладання ігрових об'єктів майже така ж, як і веб-розробка, я наведу кілька прикладів ...

Безлад і ефективність

Веб-аналогія: у вас є багато подібних елементів, які можуть динамічно генеруватися на льоту у відповідь на взаємодію користувачів і хочуть тримати їх в порядку. Unity Translation: Якщо ви створюєте клон Minecraft, і у вас багато блоків у сцені, вам потрібно додати та видалити `` шматки '' блоків зі сцени з міркувань продуктивності. Таким чином, мати їх батьківським порожнім GameObject для кожного фрагмента має сенс, оскільки видалення батьківського фрагмента видаляє всі дочірні блоки.

Позиціонування

Веб-аналогія: Ви хочете зберегти позицію вмісту, що міститься "відносно" до контейнера, а не до веб-сторінки. Unity Translation: Ви створили купу допоміжних безпілотників, які ширяють навколо плеєра. Ви дійсно не хотіли б писати код, щоб наказати їм переслідувати гравця, тому замість цього ви створюєте їх як діти дочірнього об'єкта гри гравця.

Вбудовані компоненти Unity

Модель акторської складової

GameObjects самі по собі досить марні - як ми вже бачили, вони в основному просто контейнери. Для того, щоб додати до них функціональність, ми повинні додати компоненти, які, по суті, є скриптами, написаними на C # або Javascript.

Unity працює над моделлю Actor Component, простіше кажучи, GameObjects - це актори, а Components - ваші сценарії.

Якщо ви писали будь-які веб-програми, раніше ви будете знайомі з ідеєю створення невеликих багаторазових компонентів, таких як кнопки, елементи форми, гнучкі макети, що мають різні різні директиви та настроювані властивості. Потім збираємо ці невеликі компоненти у великі веб-сторінки.

Великою перевагою цього підходу є рівень багаторазового використання та чітко визначені канали зв'язку між елементами. Так само при розробці ігор, ми хочемо мінімізувати ризик ненавмисних побічних ефектів. Маленькі помилки, як правило, виходять з-під контролю, якщо ви не обережні, і їх надзвичайно складно налагодити. Таким чином, створення невеликих, надійних та багаторазових компонентів є критичним.

Ключові вбудовані компоненти

Думаю, настав час для кількох прикладів вбудованих компонентів, які надає движок Unity Games.

  • MeshFilter: дозволяє призначити матеріали 3D-сітці для GameObject
  • MeshRender: дозволяє призначити матеріали 3D-сітці
  • [Графа | Mesh] Collider: Уможливлює виявлення GameObject під час зіткнень
  • Rigidbody: дозволяє реалістичну фізичну симуляцію для дії на GameObjects за допомогою 3D-сіток, і буде ініціювати події виявлення на колодках
  • Світло: висвітлює частини вашої сцени
  • Камера: визначає область перегляду програвача, яку слід приєднати до GameObject
  • Різні компоненти інтерфейсу користувача для відображення графічних інтерфейсів

Навантажень більше, але це основні, з якими вам доведеться ознайомитись. Одна порада полягає в тому, що ви можете отримати доступ до всіх документів для них через посібник з єдності та посилання на сценарії офлайн, де б ви не знаходились:

Створення користувацьких компонентів

Вбудовані компоненти в першу чергу контролюють фізику та візуальні ефекти, але щоб дійсно зробити гру, вам потрібно буде прийняти введення користувача та маніпулювати цими стандартними компонентами, а також самими GameObjects.

Щоб розпочати створення компонентів, перейдіть до потрібного GameObject> Додати компонент> введіть ім'я вашого нового компонента в рядок пошуку> новий сценарій (c #).

Як загальну рекомендацію я б радив не використовувати Javascript у Unity. Він не постійно оновлювався з усіма чудовими матеріалами, що поставляються з ES6, і більшість більш просунутих матеріалів покладаються на матеріали C #, перенесені на Javascript ... Це просто стає гігантським обхідним процесом на моєму досвіді.

Структура моно поведінки

Основні функції

Усі компоненти успадковуються від класу MonoBehaviour. Він включає кілька стандартних методів, найголовніше:

  • void Start (), який викликається щоразу, коли об'єкт, що містить скрипт, створюється в сценарії. Це корисно будь-коли, коли ми хочемо виконати певний код ініціалізації, наприклад. встановити спорядження гравця після того, як вони з’являться в матчі.
  • void Update (), яке називається кожним кадром. Саме сюди піде основна частина коду, що включає введення користувача, оновлення різних властивостей, таких як рух плеєра в сцені.

Змінні інспектора

Часто ми хочемо зробити компоненти максимально гнучкими. Наприклад, у всіх видів зброї може бути різний збиток, швидкість стрільби, has_sight тощо. Хоча вся зброя - це, по суті, одне і те ж, ми можемо захотіти мати можливість швидко створювати різні варіації за допомогою редактора єдності.

Інший приклад, коли ми можемо захотіти це зробити, це при створенні компонента інтерфейсу, який відстежує рухи миші користувача та розміщує курсор у вікні перегляду. Тут ми можемо захотіти контролювати чутливість курсору до рухів (якщо користувач використовував джойстик або геймпад проти комп’ютерної миші). Таким чином, було б доцільно, щоб цю змінну легко змінювати як в режимі редагування, так і експериментувати з ними під час виконання.

Це можна зробити легко, просто оголосивши їх як загальнодоступні змінні в тілі компонента.

Прийняття введення користувачем

Звичайно, ми хочемо, щоб наша гра реагувала на введення користувачами. Найбільш поширені способи зробити це за допомогою таких методів у функції Update () компонента (або в іншому місці, яке вам подобається):

  • Input.GetKey (KeyCode.W) Повертає клавішу True W утримується натиснутою
  • Input.GetKeyDown (KeyCode.W) Повертає значення True при першому натисканні клавіші W
  • Input.GetAxis (“Вертикальний”), Input.GetAxis (“Горизонтальний”) Повертає між -1,1 рухом введення миші

Маніпулювання об'єктами гри

Отримавши введення користувача, ми хочемо, щоб GameObjects на нашій сцені реагували. Існує кілька типів відповідей, які ми можемо розглянути:

  • Переклад, обертання, масштаб
  • Створіть нові GameObjects
  • Надсилання повідомлень до існуючих GameObjects / компонентів

Трансформації

Всі GameObjects мають властивість перетворення, що дозволяє виконувати різні корисні маніпуляції з поточним ігровим об’єктом.

Наведені вище методи досить зрозумілі, лише зауважте, що ми використовуємо малий регістр gameObject для посилання на GameObject, якому належить цей конкретний екземпляр компонента.

Загалом, гарною практикою є використання локального [Position, Rotation], а не глобального положення / обертання об’єкта. Зазвичай це полегшує переміщення об’єктів таким чином, щоб це мало сенс, оскільки вісь локального простору буде орієнтована та центрована на батьківському об’єкті, а не на світовому початку та напрямках x, y, z.

Якщо вам потрібно перетворити між місцевим та світовим простором (що часто буває), ви можете використовувати наступне:

Як ви можете собі уявити, за цим стоїть досить проста лінійна алгебра, на яку натякає «зворотний» в назві методу.

Створення нових GameObjects

Оскільки GameObjects - це в основному все на вашій сцені, можливо, ви захочете мати можливість генерувати їх на льоту. Наприклад, якщо у вашого гравця є якийсь засіб для запуску снарядів, ви можете мати змогу створювати снаряди на льоту, які мають власну інкапсульовану логіку польоту, нанесення пошкоджень тощо ...

Спочатку нам потрібно представити поняття збірних конструкцій . Ми можемо створити їх, просто перетягнувши будь-який GameObject в ієрархії сцени в папку активів.

Тут, по суті, зберігається шаблон об’єкта, який ми щойно мали на нашій сцені, з однаковими конфігураціями.

Отримавши ці префабричні компоненти, ми можемо призначити їх інспекторським змінним (як ми вже говорили раніше) для будь-якого компонента сцени, щоб ми могли будь-коли створювати нові GameObjects, як зазначено в префабі.

Потім ми можемо виконати "екземпляр" збірного модуля та маніпулювати ним до потрібного місця на сцені та встановити необхідні батьківські зв'язки.

Доступ до інших об'єктів і компонентів GameObjects

Часто нам потрібно спілкуватися з іншими GameObjects, а також пов'язаними з ними компонентами. Коли у вас є посилання на ігровий об’єкт, це досить просто.

ComponentName comp = some_game_object.GetComponent ();

Після цього ви зможете отримати доступ до будь-якого із загальнодоступних методів / змінних компонента, щоб маніпулювати GameObject. Це прямий біт, однак насправді отримати посилання на GameObject можна кількома способами ...

Доступ через змінну інспектора

Це найпростіше. Просто створіть загальнодоступну змінну для GameObject, як ми вже продемонстрували раніше за допомогою префабів, і вручну перетягніть її на компонент за допомогою інспектора. Потім перейдіть до змінної, як зазначено вище.

Доступ через позначення

Ми можемо позначати GameObjects або збірні файли за допомогою інспектора, а потім використовувати функції ігрового об'єкта find для пошуку посилань на них.

Це просто робиться, як показано нижче.

GameObject some_game_object = GameObject.FindGameObjectWithTag (“Цегла”);

Доступ через перетворення

Якщо ми хочемо отримати доступ до компонентів у якомусь батьківському об'єкті, ми можемо легко це зробити за допомогою атрибута transform.

ComponentName comp = gameObject.transform.parent.GetComponent ();

Доступ через SendMessage

Як варіант, якщо ми хочемо надіслати повідомлення багатьом іншим компонентам або хочемо надіслати повідомлення об’єкту, який знаходиться далеко за вкладеною ієрархією, ми можемо використовувати функції відправки повідомлень, які приймають ім’я функції, за якою йдуть аргументи.

gameObject.SendMessage (“MethodName”, параметри); // Трансляція messagegameObject.SendMessageUpwards (“MethodName”, параметри); // Отримується лише компонентами, які вкладені вище.

Проміння

Можливо, ви вже чули про це раніше, коли люди порівнюють ігри FPS, які базуються на "фізиці" або "на основі променів". По суті, променеве випромінювання схоже на наявність лазерного вказівника, який при зіткненні з «колайдером» або «твердим тілом» повертає «удар» і передає назад деталі об’єкта.

Є два сценарії, коли це стане в нагоді (мабуть, навантажень більше):

  1. Якщо ви розробляли систему зброї для гри, ви могли б використовувати проміння для виявлення попадання і навіть налаштувати довжину променя так, щоб рукопашні предмети «потрапляли» лише на невеликій відстані
  2. Створіть промінь від вказівника миші до точки в тривимірному просторі, тобто якщо ви хочете, щоб користувач міг вибирати одиниці за допомогою миші в стратегічній грі.

Як бачите, код цього трохи більше задіяний. Ключове, що слід зрозуміти, це те, що для того, щоб кинути промінь туди, куди вказує миша в тривимірному просторі, потрібна трансформація ScreenPointToRay. Причиною цього є те, що камера виводить тривимірний простір у вигляді 2-го вікна перегляду на екрані вашого ноутбука, тому, природно, передбачається проекція для перенесення назад у 3D.

Виявлення зіткнень

Раніше ми вже згадували компоненти Collider та Rigidbody, які можна додати до об’єкта. Правилом зіткнень є те, що один об'єкт при зіткненні повинен мати тверде тіло, а інший - колайдер (або обидва мають обидва компоненти). Зверніть увагу, що при використанні променевого випромінювання промені будуть взаємодіяти лише з об’єктами, на яких прикріплені компоненти колайдера.

Після налаштування в будь-якому користувацькому компоненті, приєднаному до об’єкта, ми можемо використовувати методи OnCollisionEnter, OnCollisionStay та OnCollisionExit для реагування на зіткнення. Отримавши інформацію про зіткнення, ми можемо притягнути GameObject до відповідальності та використовувати те, що ми дізналися раніше, для взаємодії з приєднаними до нього компонентами.

Зауважимо одне, що тверді тіла забезпечують фізику, таку як гравітація, для предметів, тому, якщо ви хочете, щоб це було вимкнено, вам потрібно буде перевірити, що is_kinematic увімкнено.

Розширені функції

Ми не будемо вдаватися до нічого з цього зараз, але, можливо, до майбутньої статті - лише для того, щоб ви усвідомили, що вони існують.

Створення графічного інтерфейсу

Unity має повноцінний механізм інтерфейсу для викладання графічного інтерфейсу для вашої гри. Загалом ці компоненти працюють приблизно так само, як і решта двигуна.

Розширення редактора Unity

Unity дозволяє додавати власні кнопки до своїх інспекторів, щоб ви могли впливати на світ під час редагування. Наприклад, щоб допомогти у побудові світу, ви можете розробити спеціальне вікно інструментів для будівництва модульних будинків.

Анімація

Unity має графічну систему анімації, яка дозволяє поєднувати та контролювати анімацію на різних об’єктах, таких як гравці, що реалізують кісткову анімаційну систему.

Матеріали та PBR

Unity працює на фізично заснованому механізмі візуалізації, який забезпечує освітлення в реальному часі та реалістичні матеріали. Реальність полягає в тому, що вам потрібно буде спочатку навчитися 3d-моделюванню або використовувати моделі, створені та оптимізовані кимось іншим, перш ніж дійти до цього, щоб зробити речі, які насправді добре виглядають.

Поради для новачків

Якщо ви плануєте написати свою першу гру, не недооцінюйте складності та часу, необхідного для написання навіть найтривіальніших ігор. Пам’ятайте, що в більшості ігор, які виходять у Steam, команди працюють над ними протягом багатьох років!

Виберіть просту концепцію та розбийте її на невеликі досягнення. Настійно рекомендуємо розділити гру на якомога менші незалежні компоненти, оскільки набагато менше шансів натрапити на помилки, якщо компоненти залишаються простими, а не монолітними блоками коду.

Перш ніж піти і написати будь-який код для будь-якої частини вашої гри, спробуйте дослідити, що робив хтось інший, щоб вирішити ту саму проблему, - швидше за все, вони матимуть набагато хитріше рішення.

Приємні ресурси та спільноти

У ігровому дизайні є одне з найкращих спільнот серед усіх, і в цій галузі є безліч висококваліфікованих професіоналів, які розміщують контент безкоштовно або майже за безцінь. Це поле, яке вимагає моделей 3D, художників концепцій, дизайнерів ігор, програмістів тощо. Я зв’язав кілька чудових загальних ресурсів, які мені доводилось зустрічати для кожного з цих полів нижче:

Концепт-арт

  • Школа дизайну Фен Чжу (Більше 90 годин підручників з концептуального мистецтва)
  • Тайлер Едлін Арт (велике мистецьке співтовариство BST із відгуками професіоналів про щомісячні виклики)
  • Арт-кафе (інтерв'ю та майстер-класи з відомими концепт-артистами)
  • Трент Канюга (Ілюстратор та 2D-художник, який також робить власну гру)

3D-моделювання

  • CG Cookie (найкращі основи моделювання сіток у Blender Ever, вони мають безліч іншого чудового вмісту для блендера)
  • Tor Frick (Моделі та скульптори з твердої поверхні в Blender)
  • Гліб Александров (короткі потужні підручники з рендеринга в Blender)

Ігровий дизайн

  • DoubleFine Amnesia Fortnight (GameDevs, які роблять 2-тижневий хакатон і записують весь процес проектування)
  • Набір інструментів GameMakers (вивчає принципи ігрового дизайну)

Програмування

  • Герой ручної роботи (Написання гри та движка з нуля на Сі)
  • Джонатан Блов (розробник Інді, який транслює свою розробку ігор)
  • Brackeys (Підручники з Nice Unity)

Висновок

Сподіваюся, вам підручник сподобався! Я роблю трохи графічного дизайну, а також прототипи ігор та інтерфейсу, тож перевірте моє портфоліо ! Я також на пов'язані в .

Портфоліо| LinkedIn