Unreal Engine 4
Доброго дня, панове передплатники і всі, хто просто проходив тут повз. Та що я затягнув з виходом цієї посади. Дуже багато справ звалилося на мою голову в останні пару тижнів, і часу не залишалося зовсім. Для того, щоб розуміти, що написано в цьому пості, варто почитати попередній.
Для початку відповімо на кілька запитань.
Які основи програмування необхідні. Все ж таки я розповідатиму про роботу з двигуном, приклади будуть докладні і будуть вихідники, за якими цілком можна розібратися з усім. Якщо у вас не все погано з логікою та алгоритмізацією, у плані продумування рішень якоїсь проблеми, і ви можете передбачати якісь важливі події, які потрібно обов'язково враховувати, а ще у вас не все погано з математикою, тоді ще є шанси зачепитися за щось і навчитися) Потрібно більше практики. Так ми і не пишемо на чистому C + +, а використовуємо SDK движка.
Ну і раз почали ми з ВР, так і продовжимо з ВР.Доповнимо відповідь на питання вище. Я тут почитав особливості UE 4.11, який зараз готують до випуску і там може з'явитися BP-конвертер в C++ код! Але конвертація відбувається на етапі фінального складання проекту. Все одно, круто ж?

Як шукати функції BP, які ви не знайшли в C ++.Це відбувається, т.к. не підключено ту чи іншу бібліотеку. Візьмемо простенький приклад. Вам знадобилося знайти довжину вектора, але ви, вводячи назву тієї функції, не знаходите її. Просто ви намагаєтеся знайти її в батьківському або своєму поточному класі, а вона знаходиться в сторонній бібліотеці, підключеній до движка, але не до вашого класу! Якщо навести на блок BP, у описі, що з'явився, останнім рядком буденазву бібліотеки.

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

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

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

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

Давайте розглянемо його складові.
У папці Content зберігається весь контент проекту. Там і графіка, і анімації, і рівні, там зберігаються і BP класи. Загалом, це найважча папка проекту, яка, до речі, повністю складається з .uasset файлів, що є бінарниками, які сприймаються нашим движком вже як моделі, анімації, звуки і т.д.

Взагалі, .uasset містить оригінал вашого файлу та шляхи до всіх пов'язаних із цим ассетом ассети. Тобто при переміщенні ассета тієї ж зброї, шлях до якого зберігається в ассеті персонажа, не використовуючи двигун, а переміщаючи це жорстко зпапки, то ассет персонажа втратить зброю, а двигун виведе купу помилок з приводу того, що по такому шляху немає ассета з таким то ім'ям. Тобто. переміщення потрібно робити використовуючи движок у контент браузері. У папціConfigзберігаються налаштування проекту та движка для цього проекту. У папціSourceзберігаються вихідники класів, написаних нами від нашого проекту.Pikabu.uproject -це вже файл проекту, який зберігає якісь сторонні плагіни та модулі підключені для використання у проекті, необхідну версію двигуна, версію і т.д.
Це мінімум, необхідний для запуску проекту на комп'ютері. У решті папок ми маємо кеш, бінарники, згенерований проект VisualStudio, бекапи та інше, що при змінах перезбирається заново. Тобто. їх можна просто видалити і нічого страшного не станеться. Двигун все згенерує заново.
Ну варто додати, що зібраний .exe файл проекту перебуватиме по дорозі. /Saved/StagedBuilds.
Що стосується гітом, доцільно відстежувати лише файл проекту та папки source і config, т.к. зміни в інших файлах не індексуватимуться. А той же контент можна зберігати на вашому сервері або на будь-якій хмарі з автосинхронізацією і т.д.
А тепер зробимо те, що нам знадобиться для наступного уроку. У наступному уроці ми колупатимемо персонажа, а для цього нам потрібна адекватна моделька, а не руки в повітрі. Тому поговоримо про міграцію ассетів з одного проекту до іншого.

Завантаживши цей проект, запускаємо його і передаємо привіт компілятору шейдеров) У цьому проекті є купа цікавостей, до яких ми ще повертатимемося, але пізніше. Вважайте це частково збіркою спойлерів. Загалом, зараз нас цікавить тільки модель людини, її матеріали та пакет анімацій до неї.Все з цього ми мігруємо в наш проект. Що взагалі таке міграція? Як я писав вище, у .uasset важливо зберігати структуру проекту, щоб пов'язані ассети не втратили один одного. Наприклад, в одному анімаційному асеті є шлях до скелета, та й взагалі, при імпорті анімації в проект, ви повинні вказувати де у вас знаходиться скелет від тієї моделі, для якої вона призначена. У монтажній анімації взагалі може бути кілька анімацій зі звуками та системами частинок, у яких ще шляхи на матеріали, текстури тощо. Відкривши цей проект, ви ж не знаєте що з чим пов'язано, а ось двигун це все знає і може навіть відобразити карту зв'язків, якщо натиснути правою кнопкою миші по асету і натиснути на ReferenceViewer, після чого відкриється ось така штука.

Загалом що робить міграція? Міграція переглядає всі ці зв'язки та виявляє всі асети, які будь-яким чином пов'язані з тим, який ви хочете мігрувати собі до проекту, а потім копіює їх до вас. Мігрувати можна в будь-яку папку, але для використання, її вміст обов'язково потрібно перенести в корінь вашої папки content. в іншому проекті не зможете, т.к. міграція може працювати тільки з BP об'єктами, а якщо BP успадкований від C++ класу, якого спочатку немає в двигуні та у вашому проекті, тоді він і працювати не буде.
Нам потрібна модель персонажа, знаходимо її по шляху зі скріншота, тиснемо правою кнопкою, asset actions -> Migrate


З цією моделькою в наш проект переїдуть ще й усі матеріали від неї, скелет та фізичний асет. Але стандартні анімації з моделькою не пов'язані. Їх мігруємо так само, але вже натисканням папки Animations ->Migrate. До речі, в тій папці, де була модель персонажа, ще є модель автомата, можете її теж прихопити з собою. Стане в нагоді.

Ці анімації захоплять із собою скелет, який у нас вже є, можете погодитися із заміною. Ще в цій папці з анімаціями є анімації від іншої моделі. Папку Retargeting можна буде видалити, як і скелет від іншої моделі.
Чому саме ця модель? Вона має всі анімації для побудови адекватного locomotion (рух вперед, назад, ліворуч, праворуч) і пози зміщення прицілів для побудови BP для цього. Ми ж хочемо адекватно рухатися і цілитися? Шкода, що я такий собі модельєр, але нічого.
Залишаємо поки цю модель до наступного уроку. Ще ви можете захопити папці Blendspaces, про які я розповім у наступному уроці, але ви можете з ними погратися вже зараз)
Рухаємося далі. Потрібно розповісти про налаштування движка, щоб не пояснювати це в наступному уроці.

Перейшовши в налаштування, ми побачимо ось таке віконце, в якому зараз нас цікавить вкладка Maps & Моди.

Тут налаштовуються параметри проекту на кшталт стандартних карт та вибору класів персонажа гравця та іншого.Game default map- перша карта, яка відкриватиметься при запуску гри.
Editor Startup map- карта, яка першою відкривається в движку
Transition map- перехідна карта, яка відкриється під час закриття старої та запуску нової карти. Начебто вікна з написом "завантаження".
У Game Mode вибирається Default pawn class - клас персонажа, яким керуватиме гравець.HUDClass- те, що бачитиме гравець. Сюди ліпляться всякі приціли, якщо робити їх текстурою, текстури якихось ефектів при низькому хп і т.д.Player controller class- клас контролера гравця. Тобто. те, як він керуватиметься. У нас, швидше за все, буде стандартний. До речі, нічого з цього не змінюється, т.к. вибрав режим, який у нас у вихідниках і написаний на C++, де кодом прописані ці параметри. У наступному уроці це все переробимо.
На різних рівнях можна змінювати ігровий режим на інший у налаштуваннях рівня. Тобто. ми можемо різних рівнях давати гравцю побігати іншим персонажем коїться з іншими особливостями. У різні game mode можна додавати різних менеджерів, які зберігатимуться в одному екземплярі, і яких потім зможуть отримувати будь-які актори на рівні. Наприклад, можна зробити лічильник вбивств, якому повідомлятимуть ІІ про свою смерть, а вже сам цей лічильник буде збирати інформацію про кількість вбивств гравця. Game mode живе від початку і до кінця життя рівня.
Щоб подивитися, як працює Game mode, можете видалити з карти персонажа, яким ми зараз бігаємо та запустити гру. Ви все одно гратимете цим персонажем, т.к. він вказаний у game mode. Замість персонажа на рівні з'явиться точка Network player start, переміщуючи яку ви вибираєте місце, в якому з'являтиметься гравець.


Тепер поговоримо про призначення кнопок, що управляють.
У тих же налаштуваннях в розділі Engine є вкладка input.

Тут ви можете створювати базові події натискання на якісь клавіші. У першому уроці ми ставили кнопку 0 запуск обертання квадрата. Робили ми це на BP рівня, тобто. ця кнопка б працювала лише на цьому рівні. Тут, можна сказати, виставляється управління грою. Що робити приобертання миші, натискання клавіш і т.д. Ви задаєте назву, вибираєте що буде генерувати цю подію і далі вже прописуєте що буде виконуватися при натисканні на задану кнопку у ваших класах. тобто. на конкретну кнопку різним персонажам можна поставити різні функції.
Ви задаєте назву і далі можете обробляти реакцію на подію з цією назвою. Візьмемо постріл, наприклад. Ось так він задається у коді.

На подію з ім'ям"Fire", що виникає принатисканні кнопки, викликається функціяOnFire, де у нас поки що зараз прописаний одиночний постріл. Це ж провертається і до ВР.

Ну і за традицієюГУГЛОДИСПОСИЛКАдля тих кому ліньки мігрувати модельку. Орієнтовно на середу буде пост про персонажа.