Будь ласка, використовуйте цей ідентифікатор, щоб цитувати або посилатися на цей матеріал:
https://er.chdtu.edu.ua/handle/ChSTU/6037| Назва: | Рольова комп’ютерна гра жанру фентезі в піксельному 2D стилі на платформі Unity |
| Автори: | Дяченко, Петро Васильович Драбатий, Роман Ігорович |
| Ключові слова: | 2D,;РОЛЬОВА,;КОМП’ЮТЕРНА,;ГРА,;ПЛАТФОРМА,;СТВОРЕННЯ,;РЕАЛІЗАЦІЯ,;ТЕСТУВАННЯ. |
| Дата публікації: | 12-чер-2025 |
| Короткий огляд (реферат): | Індустрія комп’ютерних ігор переживає період стрімкого зростання та трансформації, демонструючи щорічне збільшення ринку на 11.50% за прогнозами до 2031 року. Особливе місце в цьому сегменті посідають двовимірні рольові ігри з піксельною графікою, які поєднують ностальгічну естетику класичних ігор з інноваційними механіками та сучасними технологічними рішеннями. Тема моєї кваліфікаційної роботи бакалавра є «Рольова комп’ютерна гра жанру фентезі в піксельному 2D стилі на платформі Unity». Світові тенденції у вирішенні поставлених завдань включають використання модульної архітектури для створення гнучких бойових систем, впровадження процедурної генерації контенту для підвищення реіграбельності та інтеграцію наративних елементів безпосередньо в ігрові механіки. Для створення гри були залучені: ігровий рушій Unity, графічний редактор Aseprite, для створення спрайтів, а також мова програмування C#. Метою кваліфікаційної роботи є розробка фентезійної рольової комп’ютерної гри в піксельному 2D стилі на платформі Unity з унікальними бойовими механіками, заснованими на комбінаціях атак, позиціонуванні та використанні елементів оточення. Об’єкт дослідження – методи та засоби створення рольових комп’ютерних ігор з використанням сучасних ігрових рушіїв та технологій. Предмет дослідження – 2D піксельна рольова гра на платформі Unity. Методи дослідження включають: системний аналіз існуючих рішень у сфері розробки рольових ігор; порівняльний аналіз платформ та інструментів розробки; об’єктно-орієнтоване проєктування архітектури гри; експериментальне тестування ігрових механік; статистичний аналіз метрик ігрового процесу; ітеративний підхід до розробки з використанням методології Agile. |
| URI (Уніфікований ідентифікатор ресурсу): | https://er.chdtu.edu.ua/handle/ChSTU/6037 |
| Розташовується у зібраннях: | 122 Комп’ютерні науки (Комп’ютерні науки та прикладне програмування) |
Файли цього матеріалу:
| Файл | Опис | Розмір | Формат | |
|---|---|---|---|---|
| Пояснювальна записка_Драбатий Роман_КНС-2101_2024-2025.pdf Restricted Access | 2.5 MB | Adobe PDF | Переглянути/Відкрити Запит копії |
Усі матеріали в архіві електронних ресурсів захищено авторським правом, усі права збережено.
Extracted text
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
ЧЕРКАСЬКИЙ ДЕРЖАВНИЙ ТЕХНОЛОГІЧНИЙ УНІВЕРСИТЕТ
Факультет інформаційних технологій і систем
Кафедра комп’ютерних наук та системного аналізу
Пояснювальна записка
до кваліфікаційної роботи
бакалавра
(освітній рівень)
на тему: «Рольова комп’ютерна гра жанру фентезі в піксельному 2D стилі
на платформі Unity»
Виконав: студент 4 курсу, групи КНС-2101
спеціальності 122 «Комп’ютерні науки»
(шифр і назва спеціальності)
освітня програма «Комп’ютерні науки та
(назва освітньої програми)
прикладне програмування
Драбатий Роман Ігорович
Керівник Дяченко П.В.
(прізвище та ініціали)
Рецензент ___________
(прізвище та ініціали)
Черкаси 2025 року
2
Черкаський державний технологічний університет
Факультет Інформаційних технологій і систем
Кафедра Комп’ютерних наук та системного аналізу
Освітній рівень Бакалавр
Спеціальність 122 – Комп’ютерні науки
Освітня програма Комп’ютерні науки та прикладне програмування
ЗАТВЕРДЖУЮ
Завідувач кафедри КН та СА
_______________ Триус Ю.В.
«____» _____________ 2025 р.
ЗАВДАННЯ
на кваліфікаційну роботу бакалавра студенту
Драбатого Романа Ігоровича
(прізвище, ім‘я, по батькові)
1. Тема роботи «Рольова комп’ютерна гра жанру фентезі в піксельному 2D стилі
на платформі Unity»
Керівник роботи Дяченко П.В., к.т.н., доцент
(прізвище, ім’я, по батькові, науковий ступінь, вчене звання)
затверджені наказом університету від «25» лютого 2025 р. №53/03-03.
2. Строк подання студентом роботи до 11 червня 2025 року
3. Вихідні дані до роботи:
Практичні навики роботи з інформаційними ресурсами. Робота з базами даних.
Звіт з виробничої практики. Звіт з наукової практики.
4. Зміст пояснювальної записки (перелік питань, що їх належить розробити):
Вступ
4.1. Теоретичні основи розробки ігор.
4.2. Системний аналіз та проєктування гри.
4.3. Методи та засоби реалізації гри.
4.4. Практична реалізація гри.
Висновки.
5. Перелік додатків (з точним зазначенням назв додатків):
5.1. Додаток А. Специфікація 482.ЧДТУ. 52350-01.
3
5.2. Додаток Б. Текст програми.
5.3. Додаток В. Інструкція користувача.
5.5. Презентація у вигляді 19 слайдів.
6. Консультанти розділів роботи
Прізвище, ініціали та Підпис, дата
Розділ посада
завдання видав завдання прийняв
консультанта
7. Дата видачі
завдання 17.12.2024
КАЛЕНДАРНИЙ ПЛАН
№ Строк виконання
Назва етапів кваліфікаційної роботи магістра Примітка
з/п етапів роботи
1 Видача завдання на кваліфікаційну роботу
17.12.2024 Виконано
бакалавра.
2 Аналіз літературних джерел, об’єкту та предмету
до 28.02.2025 Виконано
дослідження.
3 Написання теоретичного розділу кваліфікаційної
до 15.03.2025 Виконано
роботи бакалавра.
4 Написання аналітичного розділу кваліфікаційної
до 01.04.2025 Виконано
роботи бакалавра.
5 Написання практичних розділів й висновків до
до 01.05.2025 Виконано
кваліфікаційної роботи бакалавра.
6 Перед захист кваліфікаційної роботи магістра на
01.06.2025 Виконано
засіданні кафедри КН та СА.
7 Подання роботи завідувачу кафедри КН та СА. до 28.05.2025 Виконано
8 Захист кваліфікаційної роботи бакалавра. 12.06.2025 Виконано
Студент _____________________________ Драбатий Р. І.
(підпис)
Керівник роботи ____________________________ Дяченко П. В.
(підпис)
4
РЕФЕРАТ
Кваліфікаційна робота бакалавра містить: 113 с., 14 рис., 43 використаних
джерел, 3 додатків.
Актуальність теми.
Індустрія комп’ютерних ігор переживає період стрімкого зростання та трансформації,
демонструючи щорічне збільшення ринку на 11.50% за прогнозами до 2031 року.
Особливе місце в цьому сегменті посідають двовимірні рольові ігри з піксельною
графікою, які поєднують ностальгічну естетику класичних ігор з інноваційними
механіками та сучасними технологічними рішеннями. Тема моєї кваліфікаційної роботи
бакалавра є «Рольова комп’ютерна гра жанру фентезі в піксельному 2D стилі на
платформі Unity». Світові тенденції у вирішенні поставлених завдань включають
використання модульної архітектури для створення гнучких бойових систем,
впровадження процедурної генерації контенту для підвищення реіграбельності та
інтеграцію наративних елементів безпосередньо в ігрові механіки.
Для створення гри були залучені: ігровий рушій Unity, графічний редактор
Aseprite, для створення спрайтів, а також мова програмування C#.
В результаті створено комп’ютерну гру, яка пропонує гравцю вражаючі ігровий
досвід та бойові механіки на кожне перепроходження.
Метою кваліфікаційної роботи є розробка фентезійної рольової комп’ютерної
гри в піксельному 2D стилі на платформі Unity з унікальними бойовими механіками,
заснованими на комбінаціях атак, позиціонуванні та використанні елементів оточення.
Для досягнення поставленої мети необхідно вирішити наступні завдання:
⎼ провести аналіз ринку рольових ігор та виявити основні тенденції розвитку
жанру;
5
⎼ дослідити існуючі бойові системи в 2D піксельних RPG та визначити їх сильні
та слабкі сторони;
⎼ проаналізувати платформи розробки ігор з акцентом на можливості Unity для
створення 2D проєктів;
⎼ розробити концепцію гри з детальним описом ігрового світу, системи
персонажів та унікальних механік;
⎼ спроєктувати архітектуру гри з використанням патернів проєктування та
найкращих практик Unity;
⎼ реалізувати основні ігрові системи: управління персонажем, бойову систему,
систему інвентарю;
⎼ створити піксельну графіку та анімацію для персонажів, ворогів та оточення;
⎼ провести тестування розроблених механік та оцінити їх вплив на ігровий
процес;
⎼ порівняти різні підходи до реалізації бойової системи та визначити
оптимальний варіант.
Об’єкт дослідження – методи та засоби створення рольових комп’ютерних ігор з
використанням сучасних ігрових рушіїв та технологій.
Предмет дослідження – 2D піксельна рольова гра на платформі Unity.
Методи дослідження включають: системний аналіз існуючих рішень у сфері
розробки рольових ігор; порівняльний аналіз платформ та інструментів розробки;
об’єктно-орієнтоване проєктування архітектури гри; експериментальне тестування
ігрових механік; статистичний аналіз метрик ігрового процесу; ітеративний підхід до
розробки з використанням методології Agile.
Перелік ключових слів: 2D, ПІКСЕЛЬНА, РОЛЬОВА, КОМП’ЮТЕРНА, ГРА,
АНАЛІЗ, ПРОЄКТУВАННЯ, ПЛАТФОРМА, КОМПОНЕНТ, СИСТЕМА,
РЕАЛІЗАЦІЯ, СТВОРЕННЯ, ТЕСТУВАННЯ.
6
ABSTRACT
The qualification work of the bachelor contains: 113 pages, 14 figures, 43 used
sources, 3 appendices.
Actuality of theme.
The computer games industry is experiencing a period of rapid growth and
transformation, demonstrating an annual market increase of 11.50% according to forecasts until
2031. A special place in this segment is occupied by two-dimensional role-playing games with
pixel graphics, which combine the nostalgic aesthetics of classic games with innovative
mechanics and modern technological solutions. The topic of my bachelor's qualification paper
is «A Fantasy Role-Playing Computer Game in 2D Pixel Art Style on the Unity Platform».
Global trends in solving the set tasks include the use of modular architecture for creating
flexible combat systems, the implementation of procedural content generation to enhance
replayability, and the integration of narrative elements directly into gameplay mechanics.
The following were involved in creating the game: the Unity game engine, Aseprite
graphic editor for creating sprites, and the C# programming language.
As a result, a computer game has been created that offers players an impressive gameplay
experience and combat mechanics for each playthrough.
The goal of the qualification paper is to develop a fantasy role-playing computer game
in a 2D pixel art style on the Unity platform, featuring unique combat mechanics based on
attack combinations, positioning, and the use of environmental elements.
To achieve the set goal, the following tasks need to be accomplished:
⎼ conduct a market analysis of role-playing games and identify key trends in the genre's
development;
⎼ research existing combat systems in 2D pixelated RPGs and identify their strengths
and weaknesses;
7
⎼ analyze game development platforms with an emphasis on Unity's capabilities for
creating 2D projects;
⎼ develop a game concept with a detailed description of the game world, character
system, and unique mechanics;
⎼ design the game's architecture using design patterns and Unity's best practices;
⎼ implement core gameplay systems: character control, combat system, inventory
system;
⎼ create pixel graphics and animations for characters, enemies, and environments;
⎼ conduct testing of the developed mechanics and evaluate their impact on gameplay;
⎼ compare different approaches to implementing a combat system and determine the
optimal option.
Object of research – methods and tools for creating role-playing computer games using
modern game engines and technologies.
Subject of research – 2D pixel role-playing game on the Unity platform.
Research methods include: system analysis of existing solutions in the field of role-
playing game development; comparative analysis of development platforms and tools; object-
oriented design of the game's architecture; experimental testing of game mechanics; statistical
analysis of gameplay metrics; and an iterative development approach using the Agile
methodology.
List of key words: 2D, PIXEL, ROLE-PLAYING, COMPUTER, GAME, ANALYSIS,
DESIGN, PLATFORM, COMPONENT, SYSTEM, IMPLEMENTATION, CREATION,
TESTING.
8
ЗМІСТ
ВСТУП 11
РОЗДІЛ 1. ТЕОРЕТИЧНІ ОСНОВИ РОЗРОБКИ ІГОР 14
1.1. Аналіз ринку рольових ігор 14
1.2. Огляд ігор жанру фентезі в піксельному 2D стилі 16
1.3. Аналіз платформ розробки ігор з акцентом на Unity 19
1.4. Огляд методів та інструментів розробки 2D ігор 22
РОЗДІЛ 2. СИСТЕМНИЙ АНАЛІЗ ТА ПРОЄКТУВАННЯ ГРИ 26
2.1. Системний аналіз гри як об’єкта розробки 26
2.2. Концептуальне проєктування гри 29
2.2.1. Ігровий світ та сюжетна лінія 29
2.2.2. Система персонажів та прогресія 32
2.2.3. Ігрова механіка та правила 33
2.3. Проєктування архітектури гри 36
2.3.1. Компоненти гри та їх взаємодія 36
2.3.2. Структури даних та алгоритми 40
2.3.3. Проєктування інтерфейсу користувача 43
2.4. Специфікація вимог до гри 45
РОЗДІЛ 3. МЕТОДИ ТА ЗАСОБИ РЕАЛІЗАЦІЇ ГРИ 51
3.1. Підходи до створення піксельної графіки та анімації 51
РОЗДІЛ 4. ПРАКТИЧНА РЕАЛІЗАЦІЯ ГРИ 55
4.1. Налаштування середовища розробки та структура проєкту 55
4.2. Реалізація основних систем гри 58
4.2.1. Система управління персонажем 58
4.2.2. Система бою 63
4.2.3. Системи інвентаря та предметів 67
4.3. Реалізація ігрових рівнів та світу 68
4.4. Створення піксельної графіки та анімації 71
4.5. Реалізація інтерфейсу користувача 74
4.6. Тестування та налагодження 77
ВИСНОВКИ 82
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ 85
ДОДАТОК А Специфікація 482.ЧДТУ. 52350-01 90
ДОДАТОК Б Текст програми 92
9
ДОДАТОК В Інструкція користувача 112
10
ПЕРЕЛІК УМОВНИХ ПОЗНАЧЕНЬ, СИМВОЛІВ, СКОРОЧЕНЬ І ТЕРМІНІВ
2D – двовимірний простір
AI – Artificial Intelligence (Штучний Інтелект)
API – Application Programming Interface (Інтерфейс прикладного програмування)
ARPG – Action Role-Playing Game (Рольова гра в жанрі екшн)
CAGR – Compound Annual Growth Rate (Середньорічний темп зростання)
DLC – Downloadable Content (Завантажуваний вміст)
DPS – Damage Per Second (Шкода в секунду)
FPS – Frames Per Second (Кадри в секунду)
GDD – Game Design Document (Документ дизайну гри)
HP – Health Points (Одиниці здоров’я)
HUD – Heads-Up Display (Індикація на екрані)
JRPG – Japanese Role-Playing Game (Японська рольова гра)
NPC – Non-Player Character (Неігровий персонаж)
PVE – Player versus Environment (Гравець проти оточення)
PVP – Player versus Player (Гравець проти гравця)
RPG – Role-Playing Game (Рольова гра)
SDK – Software Development Kit (Набір для розробки програмного забезпечення)
UI – User Interface (Інтерфейс користувача)
UX – User Experience (Досвід користувача)
XP – Experience Points (Одиниці досвіду)
URP – Universal Render Pipeline (Універсальний конвеєр рендерингу)
LTS – Long-Term Support (Довготривала підтримка)
JSON – JavaScript Object Notation (Об’єктна нотація JavaScript)
Git – розподілена система керування версіями
11
ВСТУП
Індустрія комп’ютерних ігор переживає період стрімкого зростання та
трансформації, демонструючи щорічне збільшення ринку на 11.50% за прогнозами до
2031 року. Особливе місце в цьому сегменті посідають двовимірні рольові ігри з
піксельною графікою, які поєднують ностальгічну естетику класичних ігор з
інноваційними механіками та сучасними технологічними рішеннями. Актуальність
розробки таких ігор зумовлена не лише економічною доцільністю – середній дохід
піксельних ігор становить близько 3335USD при оптимальній ціновій політиці від 5.99
до $14.99, але й культурним феноменом повернення до ретро-стилістики в поєднанні з
передовими ігровими механіками.
Сучасний етап розвитку рольових ігор характеризується пошуком унікальних
підходів до реалізації бойових систем, які б виділяли продукт серед тисяч інших
проєктів. Інноваційні рішення, такі як гібридні бойові системи, що поєднують реальний
час з покроковою стратегією (як у грі Warside), або інтеграція механік побудови колод у
традиційні RPG системи (Stand Alone), демонструють потенціал для створення
захоплюючого ігрового досвіду. Це підкреслює важливість дослідження та розробки
власних унікальних механік, які могли б конкурувати на міжнародному ринку.
Платформа Unity зарекомендувала себе як один із провідних інструментів для
створення двовимірних ігор завдяки своїй розвиненій системі роботи зі спрайтами,
вбудованим інструментам анімації, підтримці тайлових карт та широким можливостям
кросплатформної розробки. Наявність великої спільноти розробників, обширної
документації та навчальних матеріалів робить Unity оптимальним вибором для
реалізації амбітних проєктів у сфері інді-розробки. Додатково, інтеграція сучасних
візуальних ефектів, таких як динамічне освітлення та системи частинок, дозволяє
створювати візуально привабливі проєкти, зберігаючи при цьому класичну піксельну
естетику.
12
Аналіз сучасного стану проблеми показує, що провідні світові розробники активно
експериментують з жанровими конвенціями та механіками. Компанії, такі як Team17,
Devolver Digital, та незалежні студії демонструють успішні кейси монетизації
піксельних RPG шляхом поєднання якісного геймплею з унікальним візуальним стилем.
Українські розробники також починають активно виходити на цей ринок, хоча
специфічні дослідження в цій галузі в українському академічному середовищі ще
недостатні. Дослідження Зварич та ін. щодо гейміфікації в освіті демонструють
зростаючий інтерес до ігрових механік в Україні, що створює передумови для
подальшого розвитку індустрії.
Світові тенденції у вирішенні поставлених завдань включають використання
модульної архітектури для створення гнучких бойових систем, впровадження
процедурної генерації контенту для підвищення реіграбельності та інтеграцію
наративних елементів безпосередньо в ігрові механіки. Особлива увага приділяється
балансуванню складності та доступності, створенню інтуїтивно зрозумілих інтерфейсів
та оптимізації продуктивності для різних платформ, включаючи мобільні пристрої, які
становлять найбільший сегмент ринку піксельних ігор.
Метою кваліфікаційної роботи є розробка фентезійної рольової комп’ютерної
гри в піксельному 2D стилі на платформі Unity з унікальними бойовими механіками,
заснованими на комбінаціях атак, позиціонуванні та використанні елементів оточення.
Для досягнення поставленої мети необхідно вирішити наступні завдання:
⎼ провести аналіз ринку рольових ігор та виявити основні тенденції розвитку
жанру;
⎼ дослідити існуючі бойові системи в 2D піксельних RPG та визначити їх сильні
та слабкі сторони;
⎼ проаналізувати платформи розробки ігор з акцентом на можливості Unity для
створення 2D проєктів;
13
⎼ розробити концепцію гри з детальним описом ігрового світу, системи
персонажів та унікальних механік;
⎼ спроєктувати архітектуру гри з використанням патернів проєктування та
найкращих практик Unity;
⎼ реалізувати основні ігрові системи: управління персонажем, бойову систему,
систему інвентарю;
⎼ створити піксельну графіку та анімацію для персонажів, ворогів та оточення;
⎼ провести тестування розроблених механік та оцінити їх вплив на ігровий
процес;
⎼ порівняти різні підходи до реалізації бойової системи та визначити
оптимальний варіант.
Об’єкт дослідження – методи та засоби створення рольових комп’ютерних ігор з
використанням сучасних ігрових рушіїв та технологій.
Предмет дослідження – 2D піксельна рольова гра на платформі Unity.
Методи дослідження включають: системний аналіз існуючих рішень у сфері
розробки рольових ігор; порівняльний аналіз платформ та інструментів розробки;
об’єктно-орієнтоване проєктування архітектури гри; експериментальне тестування
ігрових механік; статистичний аналіз метрик ігрового процесу; ітеративний підхід до
розробки з використанням методології Agile.
Структура роботи відповідає поставленим завданням і включає чотири основні
розділи: теоретичні основи розробки ігор, системний аналіз та проєктування, методи та
засоби реалізації, практична реалізація з тестуванням. Така організація матеріалу
забезпечує логічний перехід від теоретичних засад до практичного втілення унікальної
рольової гри з інноваційними бойовими механіками.
14
1. ТЕОРЕТИЧНІ ОСНОВИ РОЗРОБКИ ІГОР
1.1. Аналіз ринку рольових ігор
Індустрія рольових комп’ютерних ігор демонструє стабільне зростання та
динамічний розвиток протягом останніх років. За даними аналітичних компаній,
світовий ринок RPG оцінювався у 23.21 мільярда USD станом на 2023 рік.
Прогнозується,що до 2031 року обсяг ринку сягне 316.3 мільярда із середньорічним
темпом зростання (CAGR) у 16.2%. Альтернативні прогнози вказують на більш
консервативні оцінки – $53.8 мільярда до 2032 року з CAGR 9.8%, що може бути
пов’язано з різними методологіями розрахунків та охопленням сегментів ринку.
Основними рушійними силами зростання ринку є масове поширення мобільних
пристроїв, розвиток кросплатформних технологій та впровадження інноваційних
ігрових механік. Особливу роль відіграє сегмент мобільних RPG, який домінує завдяки
моделі free-to-play з внутрішньоігровими покупками. Настільні рольові ігри також
демонструють значне зростання – 11.84% CAGR з прогнозом досягнення $4.71 мільярда
до 2032 року.
Рисунок 1.1 – Динаміка зростання ринку RPG 2023-2032
15
Географічний розподіл ринку показує домінування Північної Америки через
високий рівень доходів та раннє впровадження технологій. Азійсько-Тихоокеанський
регіон демонструє найшвидші темпи зростання, особливо в Китаї та Японії, де мобільні
ігри стали основною формою розваг. Український ринок, хоч і не виділяється окремо у
світових звітах, робить свій внесок через активну спільноту інді-розробників.
Таблиця 1.1 – Прогнози розвитку ринку RPG за різними оцінками
Прогноз на
Аналітична
Оцінка 2023 2031-2032 CAGR Примітки
компанія
рр.
Verified
23.21мільярда|316.3 Включає всі
Market 16.2%
мільярда (2031) платформи
Research
23.21мільярда|53.8 Консервативна
DataIntelo 9.8%
мільярда (2032) оцінка
$73.46 Акцент на
Statista — мільярда 6.88% мобільний
(2029) сегмент
$4.71
Global Growth
— мільярда 11.84%
Insights
(2032)
Ключові тенденції розвитку ринку включають гібридизацію жанрів, впровадження
елементів штучного інтелекту для створення динамічних наративів та інтеграцію
соціальних механік. Модель монетизації еволюціонує від традиційної одноразової
покупки до сервісної моделі з постійним оновленням контенту (Games as a Service).
Незалежні розробники активно використовують краудфандингові платформи для
фінансування амбітних проєктів, що призводить до диверсифікації ринку та появи
інноваційних концепцій.
16
1.2. Огляд ігор жанру фентезі в піксельному 2D стилі
Піксельні рольові ігри фентезійного жанру переживають своєрідний ренесанс,
поєднуючи ностальгічну естетику з сучасними ігровими механіками. Цей піджанр
характеризується використанням обмеженої палітри кольорів, чітко вираженими
пікселями та стилізацією, що нагадує класичні 8-16-бітні консолі, але з додаванням
сучасних візуальних ефектів, таких як динамічне освітлення та системи частинок.
Серед найуспішніших представників жанру варто виділити CrossCode (2020), який
продемонстрував комерційний успіх з понад 1 мільйоном проданих копій та 95%
позитивних відгуків у Steam. Гра поєднує динамічний бій у реальному часі з системою
комбо-атак та головоломками, заснованими на елементальних здібностях. Візуальний
стиль CrossCode використовує детальне піксельне мистецтво з яскравими палітрами
кольорів, що нагадує золоту еру 16-бітних консолей.
Рисунок 1.2 – Приклад візуального стилю гри CrossCode
17
Гра Alabaster Dawn, від Radical Fish Games (творців CrossCode), очікується до
виходу у 2025 році. Гра обіцяє революційну для піксельних RPG бойову систему,
натхненну серіями Devil May Cry та Kingdom Hearts, з 8 унікальними типами зброї та
складною системою елементальних комбінацій. Це демонструє тенденцію до
ускладнення механік у піксельних іграх, виходячи за традиційні рамки жанру.
Рисунок 1.3 – Концепт-арт гри Alabaster Dawn
Сучасні піксельні фентезі RPG можна класифікувати за кількома критеріями:
1. За типом бойової системи:
⎼ у реальному часі (CrossCode, Hyper Light Drifter);
⎼ покрокові (Octopath Traveler, Sea of Stars);
⎼ гібридні (Dead Weight, Warside).
2. За наративною структурою:
⎼ лінійні з акцентом на сюжет (Children of Morta);
18
⎼ з відкритим світом та нелінійним проходженням (Moonlighter);
⎼ з процедурною генерацією (Rogue Legacy 2).
3. За візуальним стилем:
⎼ класичний піксель-арт (Stardew Valley);
⎼ модернізований з ефектами (CrossCode);
⎼ мінімалістичний (Hyper Light Drifter).
Комерційний успіх піксельних RPG підтверджується статистикою: середній дохід
таких ігор становить близько 3335, при оптимальній ціновій політиці від5.99 до
$14.99. Witchbrook, очікувана гра від Chucklefish (видавців Stardew Valley), демонструє
інший підхід – поєднання симуляції шкільного життя з магічними елементами та
дослідженням відкритого світу. Пастельна піксельна естетика гри створює унікальну
атмосферу, що відрізняє проєкт від типових фентезійних сеттингів.
Рисунок 1.4 – Порівняння візуальних стилів піксельних RPG
19
1.3. Аналіз платформ розробки ігор з акцентом на Unity
Вибір платформи розробки є критично важливим рішенням, яке визначає технічні
можливості, швидкість розробки та потенційну аудиторію гри. Сучасний ринок
пропонує кілька потужних рішень для створення 2D-ігор, кожне з яких має свої переваги
та обмеження.
Unity зарекомендувала себе як універсальна платформа, що підтримує розробку як
2D, так і 3D проєктів. Для піксельних RPG Unity пропонує спеціалізовані інструменти:
систему Tilemap для створення рівнів, Sprite Editor для роботи з піксельною графікою та
потужну систему анімації. Ключовою перевагою Unity є її Asset Store, де представлено
понад 30 000 ресурсів для піксель-арту, включаючи готові тайлові системи, ретро-
шейдери та рішення для pixel-perfect камери.
Таблиця 1.2 – Порівняння платформ для розробки 2D ігор
Мова Можливості для Крива
Платформа Ліцензія
програмування 2D навчання
Безкоштовна/Pro Tilemap, Sprite
Unity C# Висока
($1860/рік) Editor, 2D Physics
Вбудовані 2D
Godot Безкоштовна GDScript/C# Середня
інструменти
Drag-and-drop,
GameMaker $99+/рік GML оптимізована для Низька
2D
Візуальне Розробка у Дуже
Construct 3 $99+/рік
програмування браузері низька
Unity демонструє переваги в кількох ключових аспектах для розробки піксельних
RPG:
1. Продуктивність та масштабованість. Технологічний стек Unity Data-Oriented
Technology Stack (DOTS) дозволяє ефективно обробляти складні піксельні анімації
20
та великі тайлові карти. Це особливо важливо для RPG з детальними світами та
численними NPC.
2. Екосистема та спільнота. Маючи понад 150 000 навчальних матеріалів на
YouTube та офіційні курси Unity Learn, платформа пропонує найкращу підтримку
для новачків. Форуми Unity містять рішення практично для будь-якої проблеми,
що може виникнути під час розробки.
3. Кросплатформеність. Unity підтримує експорт на 25+ платформ без суттєвих
змін коду. Це критично для інді-розробників, які прагнуть максимального
охоплення аудиторії.
Рисунок. 1.5 – Інтерфейс Unity, налаштований для 2D проєкту
Godot, як безкоштовна альтернатива, приваблює розробників відсутністю
ліцензійних відрахувань та легковаговістю. Рушій спеціально оптимізований для 2D
розробки, що робить його більш ефективним для простіших проєктів. Однак екосистема
сторонніх рішень значно менша, що вимагає більше часу на розробку власних систем.
21
GameMaker Studio залишається популярним вибором для швидкого
прототипування завдяки інтуїтивно зрозумілому drag-and-drop інтерфейсу. Успішні
комерційні проєкти, такі як Hyper Light Drifter та Katana Zero, доводять спроможність
платформи. Проте обмеження в масштабованості роблять її менш придатною для
амбітних RPG проєктів.
Construct 3 представляє новий підхід із повністю браузерною розробкою та
візуальним програмуванням. Хоча це знижує поріг входу, обмеження браузера
ускладнюють створення складних систем, необхідних для повноцінних RPG.
1.4. Огляд методів та інструментів розробки 2D ігор
Сучасна розробка 2D-ігор вимагає комплексного підходу з використанням
спеціалізованих інструментів для кожного етапу виробництва. Технологічний стек для
створення піксельної RPG включає інструменти для арту, анімації, звукового дизайну та
геймдизайну.
Інструменти для створення піксель-арту еволюціонували від простих растрових
редакторів до спеціалізованих рішень. Aseprite домінує в цій ніші завдяки функціям,
спеціально розробленим для піксельного мистецтва: підтримка обмежених палітр
кольорів, інструменти для створення тайлів та вбудована система анімації з
калькуванням (onion skinning). GraphicsGale та Pixaki пропонують альтернативи з
акцентом на простоту використання та інтеграцію з планшетами.
22
Рисунок. 1.6 – Інтерфейс Aseprite з прикладом роботи
Системи анімації для 2D розробки поділяються на два основні підходи: покадрова
анімація та скелетна анімація. Spine 2D революціонізував анімацію персонажів,
дозволяючи створювати плавні рухи з мінімальними графічними ресурсами через
систему кісток та деформацію сітки (mesh deformation). DragonBones пропонує
безкоштовну альтернативу зі схожим функціоналом. Для піксельних ігор часто
поєднують обидва підходи: скелетну анімацію для великих об’єктів та покадрову для
дрібних деталей.
Таблиця 1.3 – Порівняння інструментів для розробки 2D ігор
Ключові Інтеграція з
Категорія Інструмент Ціна
особливості Unity
Спеціалізовані
Експорт
Піксель-арт Aseprite $20 піксельні
спрайтів
інструменти
23
Ключові Інтеграція з
Категорія Інструмент Ціна
особливості Unity
Скелетна анімація, Нативна
Анімація Spine 2D $69+
деформація сітки підтримка
Безкоштовно для Адаптивна музика, Плагін для
Звук FMOD
інді 3D звук Unity
Колаборація, Експорт
Прототипування Figma Безкоштовно/Pro
векторна графіка ассетів
Звуковий дизайн у сучасних 2D-іграх виходить за рамки простого відтворення
звуків. FMOD та Wwise дозволяють створювати адаптивні саундтреки, що реагують на
ігрові події. Для піксельних RPG особливо важлива можливість створення "чіптюн"
музики – інструменти на кшталт FamiStudio емулюють звукові чіпи класичних консолей.
Інструменти геймдизайну та прототипування стали невід’ємною частиною
процесу розробки. Twine використовується для створення інтерактивних наративів та
діалогових дерев. Figma та Adobe XD дозволяють швидко прототипувати інтерфейси та
ігрові екрани. Спеціалізовані інструменти, такі як Machinations, використовуються для
балансування RPG механік шляхом візуалізації ігрової економіки.
Тренди 2023-2025 років показують зростаючу популярність no-code інструментів.
GDevelop та подібні платформи дозволяють створювати прості 2D-ігри без написання
24
коду, що знижує поріг входу в геймдев. Однак для створення унікальних механік та
оптимізації продуктивності традиційне програмування залишається необхідним.
Рисунок 1.7 – Пайплайн розробки 2D-гри з використанням різних інструментів
Інтеграція штучного інтелекту в інструменти розробки стає новим трендом.
GitHub Copilot допомагає в написанні коду, а Midjourney та Stable Diffusion
використовуються для генерації концепт-артів, хоча для фінального піксель-арту ручна
робота залишається незамінною через необхідність точного контролю кожного пікселя.
Висновки до розділу 1
25
Проведений аналіз теоретичних основ розробки ігор дозволяє зробити наступні
висновки:
1. Ринок рольових комп’ютерних ігор демонструє стабільне зростання з
прогнозованим CAGR в діапазоні від 6.88% до 16.2%, залежно від сегмента та
методології оцінки. Мобільний сегмент домінує завдяки доступності та моделі
free-to-play, що створює можливості для інді-розробників виходити на ринок з
інноваційними проєктами.
2. Піксельні RPG фентезійного жанру переживають ренесанс, поєднуючи
ностальгічну естетику з сучасними механіками. Успіх проєктів на кшталт
CrossCode (1 млн+ продажів) доводить комерційну життєздатність жанру.
Ключовими факторами успіху є унікальні бойові системи, якісний піксель-арт та
інноваційний геймплей.
3. Unity залишається оптимальною платформою для розробки амбітних 2D проєктів
завдяки розвиненій екосистемі, потужним інструментам для роботи з 2D графікою
та широкій підтримці спільноти. Попри вищий поріг входження порівняно з Godot
чи GameMaker, Unity пропонує кращі можливості для масштабування та
оптимізації.
4. Сучасний інструментарій для розробки 2D-ігор охоплює всі аспекти виробництва
– від спеціалізованих редакторів піксельної графіки до систем адаптивного звуку.
Тренд на no-code рішення знижує поріг входження, але для створення унікальних
механік традиційне програмування залишається необхідним.
Отримані результати формують теоретичну базу для подальшого проєктування та
розробки рольової гри з унікальними бойовими механіками на платформі Unity.
26
2. СИСТЕМНИЙ АНАЛІЗ ТА ПРОЄКТУВАННЯ ГРИ
2.1. Системний аналіз гри як об’єкта розробки
Комп’ютерна гра є складною інтерактивною системою, що функціонує в
динамічному середовищі та взаємодіє з користувачами через множинні інтерфейси. З
точки зору системного аналізу, фентезійна рольова гра в піксельному 2D стилі може
бути представлена як сукупність взаємопов’язаних підсистем, кожна з яких виконує
специфічні функції для досягнення загальної мети – створення захоплюючого ігрового
досвіду.
Визначимо основні компоненти системи "Рольова комп’ютерна гра":
Входи системи:
⎼ дії користувача (натискання клавіш, рухи миші);
⎼ конфігураційні файли та налаштування;
⎼ збережені дані прогресу гравця;
⎼ системний час та випадкові події.
Виходи системи:
⎼ візуальне представлення ігрового світу;
⎼ звукові ефекти та музичний супровід;
⎼ зворотний зв’язок через інтерфейс користувача;
⎼ збереження стану гри.
Обробка:
⎼ обробка вводу та управління персонажем;
27
⎼ розрахунок ігрової логіки та механік;
⎼ рендеринг графіки та анімацій;
⎼ управління штучним інтелектом NPC.
Рисунок 2.1 – Контекстна діаграма системи "Рольова комп’ютерна гра"
Зовнішнє середовище системи включає гравців, операційну систему, апаратне
забезпечення та конкуруючі ігрові продукти. Внутрішня структура складається з
функціональних підсистем, що забезпечують різні аспекти ігрового процесу.
Застосування компонентно-орієнтованої архітектури дозволяє досягти високої
модульності та гнучкості системи.
Декомпозиція системи на функціональні блоки виявляє наступні основні
підсистеми:
28
1. Підсистема управління геймплеєм – координує роботу всіх компонентів,
забезпечує основний ігровий цикл та обробку подій.
2. Підсистема візуалізації – відповідає за рендеринг піксельної графіки, анімацій та
візуальних ефектів з використанням можливостей Unity 2D.
3. Підсистема ігрової логіки – реалізує правила гри, бойові механіки, систему
прогресії персонажа та взаємодію з ігровим світом.
4. Підсистема штучного інтелекту – керує поведінкою неігрових персонажів, ворогів
та динамічних елементів світу.
5. Підсистема управління даними – забезпечує збереження/завантаження гри,
управління ресурсами та конфігураціями.
Рисунок 2.2 – Діаграма декомпозиції ігрової системи
29
Системний підхід до аналізу гри дозволяє виявити критичні залежності між
компонентами та оптимізувати архітектуру для досягнення максимальної
продуктивності. Особлива увага приділяється підсистемі бойових механік, яка є
ключовим елементом для диференціації продукту на ринку.
2.2. Концептуальне проєктування гри
2.2.1. Ігровий світ та сюжетна лінія
Ігровий світ розроблюваного проєкту, "Curse of Gothicvania", є цілісним
фентезійним середовищем з унікальною похмурою естетикою, що поєднує класичні
елементи жанру з авторським баченням. Використання піксельної графіки не обмежує,
а навпаки, розширює творчі можливості через стилізацію та абстрагування візуальних
елементів. Сюжет розгортається у королівстві Готикванія, що занепало під дією
древнього прокляття. Гравець виступає в ролі Лицаря-Героя, останнього захисника, який
має зібрати чотири священні реліквії з проклятих земель для порятунку королівства.
Концепція світу гри "Curse of Gothicvania" базується на таких принципах:
1. Багатошарова структура локацій – кожна з чотирьох основних ігрових зон
(Прокляте Місто, Покинута Церква, Туманне Болото, Викривлені Печери) має
вертикальну композицію з підземеллями, наземними ділянками та підвищеними
платформами, створюючи відчуття глибини у 2D-просторі.
2. Екологічна різноманітність – світ поділений на тематичні біоми, кожен з яких
має унікальну палітру кольорів, характерних ворогів (бандити та мародери у
Місті; привиди та скелети у Церкві; павуки та болотні чудовиська на Болоті;
демонічні створіння у Печерах) та специфічні ігрові механіки (руйновані
барикади, використання святої води, отруйний туман, гравітаційні аномалії
відповідно).
30
3. Динамічне середовище – елементи оточення реагують на дії гравця, що включає
можливість штовхати ворогів з платформ, використовувати смолоскипи для
підпалу, руйнувати опори для обвалення стелі та активувати пастки проти ворогів,
як це передбачено унікальними механіками проєкту.
Таблиця 2.1 – Структура та особливості ігрового світу "Curse of Gothicvania"
Палітра Унікальні
Локація Типи ворогів Бос Реліквія
кольорів механіки
Руйновані Бандити,
Прокляте Готичні Лідер Корона
барикади, щури,
Місто темні тони бандитів Правителя
пастки кажани
Свята вода як Привиди,
Темні,
Покинута зброя, скелети, Занепалий Святий
фіолетові
Церква благословенні одержимі Архієпископ Хрест
відтінки
платформи священики
Павуки,
Отруйний
Зелені, болотні
Туманне туман, Болотяна Амулет
коричневі істоти,
Болото потопаючі Відьма Природи
тони отруйні
платформи
рослини
Демонічні
Гравітаційні
Темні, створіння,
Викривлені аномалії, Древній Кристал
кристалічні тіні,
Печери портали Демон Душі
відтінки кристальні
телепортації
големи
Наративна структура гри "Curse of Gothicvania" побудована на поступовому
розкритті таємниці прокляття та порятунку королівства. Головний герой, Лицар-Герой,
повинен послідовно пройти через прокляті землі, здолати могутніх босів та зібрати
чотири реліквії.
Елементи сюжету інтегруються в геймплей через:
⎼ деталі оточення, що розкривають історію світу та наслідки прокляття;
31
⎼ діалогову систему з нечисленними NPC, які можуть давати підказки або
завдання;
⎼ описи реліквій та інших ключових предметів, що розкривають фрагменти лору;
⎼ піксельні візуальні катсцени для представлення босів або отримання реліквій.
2.2.2. Система персонажів та прогресія
Система персонажів у "Curse of Gothicvania" зосереджена на розвитку Лицаря-
Героя, збалансовуючи RPG-механіки та доступність для гравця.
Основні атрибути головного героя (Лицар-Герой), що прогресують:
⎼ Здоров’я: зростає від 100 до 300 одиниць протягом 20 рівнів розвитку;
⎼ Базова шкода: збільшується від 10 до 50 одиниць протягом 20 рівнів розвитку;
⎼ Витривалість: підвищується від 50 до 150 одиниць протягом 20 рівнів розвитку.
Система прогресії включає розвиток через підвищення рівнів персонажа та
отримання нових ключових навичок після здобуття кожної з чотирьох реліквій:
1. Корона Правителя: надає здатність до подвійного стрибка, розширюючи
можливості дослідження рівнів;
2. Святий Хрест: активує Святий щит – тимчасову непереможність, що допомагає в
складних бойових ситуаціях;
3. Амулет Природи: дарує пасивну регенерацію здоров’я, підвищуючи виживаність
гравця;
4. Кристал Душі: відкриває доступ до режиму Берсерка, тимчасово посилюючи атаки
персонажа.
32
Унікальність системи полягає в тому, що кожна нова навичка, отримана з
реліквією, не лише посилює персонажа, але й суттєво впливає на стиль гри та відкриває
доступ до раніше недосяжних зон або секретів на рівнях, що відповідає принципам
жанру Метроідванія.
Таблиця 2.2 – Етапи прогресії персонажа "Curse of Gothicvania"
Отримання Орієнтовний
Етап Нові здібності
Реліквії рівень
Базові атаки, блок, перекат,
Початковий - 1-5
стрибок
Корона
Етап 1 Подвійний стрибок 5-10
Правителя
Святий щит (тимчасова
Етап 2 Святий Хрест 10-15
непереможність)
Етап 3 Амулет Природи Регенерація здоров’я 15-18
Фінальний
Кристал Душі Режим берсерка 18-20
етап
2.2.3. Ігрова механіка та правила
Ключовою інновацією проєкту "Curse of Gothicvania" є унікальна бойова система,
що поєднує елементи позиційного бою, комбо-механік та взаємодії з оточенням. Дизайн
механік спрямований на створення динамічного та тактичного геймплею, де кожен бій
вимагає стратегічного мислення.
Основні компоненти бойової системи:
1. Позиційна бойова система:
⎼ атаки спереду завдають базової (x1.0) шкоди;
⎼ атаки з флангу завдають підвищеної (x1.25) шкоди;
⎼ атаки зі спини завдають значно підвищеної (x1.5) шкоди.
2. Комбо-механіки (базуються на анімаціях головного героя):
33
⎼ Базові атаки: включають швидку атаку (Attack1), середню атаку (Attack2) та
важку атаку (Attack3);
⎼ Основні комбінації:
⎼ Послідовність трьох легких атак, що завершується важким ударом;
⎼ Комбінація легкої, середньої та важкої атаки, що призводить до "Вихору
клинків";
⎼ Атака під час стрибка для удару з повітря.
⎼ Позиційні комбінації:
⎼ Виконання перекату через ворога з наступною атакою зі спини подвоює шкоду
(x2);
⎼ Успішний блок з негайною контратакою може оглушити супротивника;
⎼ Атака біля стіни може відштовхнути ворога.
3. Захисні механіки:
⎼ Блок: персонаж може блокувати атаки ворогів (тривалість анімації блоку – 5
кадрів);
⎼ Перекат: дозволяє ухилятися від атак з короткочасним періодом невразливості
(тривалість анімації перекату – 9 кадрів);
⎼ Ковзання по стіні: персонаж може ковзати вздовж вертикальних поверхонь.
4. Система витривалості:
⎼ кожна дія (атаки, блок, перекат) споживає певну кількість витривалості;
34
⎼ ефективне використання перекатів та блоків вимагає від гравця точного
розрахунку часу та запасу витривалості;
⎼ витривалість поступово відновлюється, коли персонаж не виконує активних
дій.
5. Взаємодія з оточенням у бою:
⎼ можливість штовхати ворогів з платформ або в пастки;
⎼ використання смолоскипів (якщо такі є на рівні) для підпалу певних об’єктів
або ворогів;
⎼ руйнування крихких опор для обвалення частини стелі на ворогів;
⎼ активація стаціонарних пасток на рівнях для завдання шкоди супротивникам.
Формула розрахунку шкоди:
_
= (_ × _ × _) − _
де:
⎼ _ – базова шкода персонажа (залежить від рівня та екіпірування);
⎼ _ – модифікатор позиційної атаки (1.0 для фронтальної, 1.25
для флангової, 1.5 для атаки зі спини);
⎼ _ – модифікатор від виконання комбо (наприклад, x2 для
спеціального позиційного комбо);
⎼ _ – захист ворога.
35
Додаткові ігрові механіки:
1. Взаємодія з інтерактивними об’єктами: руйновані бочки, активація важелів,
відкриття скринь з анімацією.
2. Збір предметів: ключові предмети (реліквії), можливо, витратні матеріали або
колекційні предмети для розширення лору.
3. Елементи керування: стандартна для платформерів схема управління:
стрілки/WASD – рух; Z/J – атака; X/K – стрибок; C/L – блок; Shift – перекат; Space
– взаємодія.
2.3. Проєктування архітектури гри
2.3.1. Компоненти гри та їх взаємодія
Архітектура гри "Curse of Gothicvania" базується на компонентно-орієнтованому
підході Unity, що забезпечує модульність, повторне використання коду та легкість
супроводу. Кожен ігровий об’єкт складається з GameObject та прикріплених
компонентів, що визначають його поведінку та властивості. Детальна структура проєкту
була розроблена для забезпечення логічної організації всіх аспектів гри.
Основні архітектурні компоненти гри:
⎼ Гравець (Player):
⎼ ‘PlayerController.cs‘: відповідає за обробку вводу, рух (включаючи біг, стрибки,
подвійний стрибок, перекати), взаємодію з фізичним світом (перевірка землі,
стін).
⎼ ‘PlayerCombat.cs‘: реалізує логіку атаки, обробку комбо, нанесення шкоди
(включаючи розрахунок позиційної шкоди), захисні дії (блок).
36
⎼ ‘PlayerStats.cs‘: зберігає та управляє характеристиками гравця (здоров’я,
максимальне здоров’я, витривалість, рівень, досвід, атака, захист), а також
відстежує отримані реліквії та розблоковані навички.
⎼ Стандартні компоненти Unity: ‘SpriteRenderer‘, ‘Animator‘, ‘Rigidbody2D‘,
‘CapsuleCollider2D‘, ‘PlayerInput‘ (для нової системи вводу).
⎼ Ворог (Enemy):
⎼ ‘EnemyBase.cs‘: абстрактний базовий клас для всіх типів ворогів, що містить
спільну логіку (здоров’я, отримання шкоди, смерть, базові параметри атаки та
захисту).
⎼ Специфічні класи для кожного типу ворога (наприклад, ‘BanditAI.cs‘,
‘GhostAI.cs‘): успадковують ‘EnemyBase‘ та реалізують унікальну поведінку
(патрулювання, переслідування, специфічні атаки, реакції на гравця).
⎼ Стандартні компоненти Unity: ‘SpriteRenderer‘, ‘Animator‘, ‘Rigidbody2D‘,
‘BoxCollider2D‘ (або інший тип колайдера).
⎼ Системні менеджери (Systems):
⎼ ‘GameManager.cs‘: центральний компонент, що керує загальним станом гри
(пауза, завантаження рівнів, відстеження прогресу гравця, наприклад, зібрані
реліквії, поточний чекпоінт). Часто реалізується як Singleton для глобального
доступу.
⎼ ‘UIManager.cs‘: відповідає за оновлення та відображення всіх елементів
інтерфейсу користувача (HUD, меню, діалоги), взаємодіє з ‘GameManager‘ та
‘PlayerStats‘ для отримання даних.
⎼ ‘AudioManager.cs‘: керує відтворенням фонової музики та звукових ефектів.
37
⎼ ‘LocalizationManager.cs‘: завантажує та надає локалізовані текстові рядки для
всіх елементів UI, забезпечуючи українськомовний інтерфейс.
⎼ ‘ComboSystem.cs‘ (може бути інтегрований в ‘PlayerCombat‘ або існувати як
окремий компонент): відстежує введення гравця для визначення та активації
комбо-атак.
Взаємодія між компонентами організована через прямі посилання (наприклад,
‘PlayerController‘ отримує доступ до ‘Rigidbody2D‘ та ‘Animator‘, прикріплених до того
ж GameObject), через виклики методів інших компонентів (наприклад, ‘PlayerCombat‘
викликає ‘TakeDamage()‘ у ‘EnemyBase‘), через систему подій Unity (наприклад,
анімаційні події, що викликають методи у скриптах), та через централізовані менеджери
(наприклад, будь-який компонент може звернутися до ‘GameManager.Instance‘ для
отримання інформації про стан гри).
Таблиця 2.3 – Матриця взаємодії основних компонентів "Curse of Gothicvania"
(спрощено)
PlayerInpu PlayerComba
Компонент EnemyAI UIManager GameManager
t t
Ініціює дії, Опосередкова Повідомляє про
PlayerControl Отримує що можуть но оновлює ключові дії
-
ler ввід вплинути на стан гравця (стрибок,
бій для HUD перекат)
Отримує
сигнал Може
Завдає
PlayerCombat для - - запитувати стан
шкоди
атаки/бло ворогів/босів
ку
Показує
Керує
Отримує здоров’я
EnemyAI - поведінко -
шкоду ворога (через
ю ворога
UIManager)
38
PlayerInpu PlayerComba
Компонент EnemyAI UIManager GameManager
t t
Відображає
Отримує дані
дані, отримує
UIManager - - - про стан гри та
події від
гравця
інших систем
Отримує
Керує станом
інформацію
GameManage Надає дані гри,
- про -
r для UI зберігає/заванта
результат
жує прогрес
бою
2.3.2. Структури даних та алгоритми
Ефективна організація даних та оптимізовані алгоритми є критичними для
забезпечення плавного ігрового процесу, особливо в грі з динамічною бойовою
системою та взаємодією з оточенням.
Ключові структури даних та алгоритми, що використовуються або
плануються:
1. Керування станом (State Machine):
⎼ Для гравця (наприклад, ‘PlayerState‘ з можливими станами: ‘Idle‘, ‘Running‘,
‘Jumping‘, ‘Falling‘, ‘Attacking‘, ‘Blocking‘, ‘Rolling‘, ‘WallSliding‘, ‘Hurt‘,
‘Dead‘).
⎼ Для ворогів (наприклад, ‘EnemyState‘ з станами ‘Idle‘, ‘Patrol‘, ‘Chase‘, ‘Attack‘,
‘Hurt‘, ‘Dead‘).
⎼ Реалізація через перелічення (‘enum‘) та логіку умовних операторів (‘if-else‘
або ‘switch‘) в методі ‘Update()‘ відповідних скриптів, або через більш
формальний патерн "Стан" (State Pattern) для складніших сутностей
(наприклад, босів).
39
csharp
// Приклад структури простої машини станів для ворога
public abstract class EnemyBase : MonoBehaviour
{
protected enum EnemyState { Idle, Patrol, Chase, Attack,
Hurt, Dead }
protected EnemyState currentState;
// ... інші поля та методи ...
protected virtual void UpdateStateMachine()
{
switch (currentState)
{
case EnemyState.Idle:
// Логіка стану бездіяльності
break;
case EnemyState.Patrol:
// Логіка патрулювання
break;
case EnemyState.Chase:
// Логіка переслідування гравця
break;
// ... і так далі для інших станів
}
}
}
2. Обробка комбо-атак:
⎼ Використання лічильника (‘comboCounter‘) та таймера (‘lastAttackTime‘,
‘comboWindow‘) у скрипті ‘PlayerCombat.cs‘ для відстеження послідовності
атак та часових вікон для їх продовження.
⎼ Встановлення відповідних параметрів в Animator Controller (‘AttackCombo‘)
для відтворення анімацій різних етапів комбо.
3. Алгоритм розрахунку позиційної шкоди:
⎼ Реалізований у методі ‘CalculatePositionalDamage()‘ (або аналогічному) у
‘PlayerCombat.cs‘. Використовує векторні операції (‘Vector2.Angle‘,
40
‘Vector2.Dot‘, нормалізація векторів) для визначення відносного положення
гравця та ворога, а також напрямку атаки відносно напрямку "погляду" ворога
для застосування відповідних множників шкоди (фронт, фланг, спина).
4. Виявлення зіткнень та взаємодій:
⎼ Активне використання фізичної системи Unity 2D:
⎼ ‘Physics2D.OverlapCircleAll()‘ та ‘Physics2D.OverlapCircle()‘ для виявлення
об’єктів у заданому радіусі (наприклад, ворогів у зоні атаки гравця, перевірка
стану "на землі").
⎼ Колайдери-тригери (‘IsTrigger = true‘) для зон виявлення ворогів, пасток,
інтерактивних об’єктів, з обробкою подій ‘OnTriggerEnter2D‘,
‘OnTriggerStay2D‘, ‘OnTriggerExit2D‘.
⎼ Стандартні колайдери для фізичної взаємодії персонажів з оточенням.
5. Алгоритми штучного інтелекту ворогів:
⎼ Базове переслідування: Рух у напрямку гравця, якщо він знаходиться в зоні
видимості (‘(player.transform.position - transform.position).normalized‘).
⎼ Патрулювання: Рух між заданими точками (‘waypoints‘).
⎼ Прогнозування для простих атак дальнього бою (якщо такі будуть):
Спроба стріляти в точку, де гравець, ймовірно, буде через короткий проміжок
часу (для повільних снарядів).
⎼ Для босів можуть бути реалізовані складніші послідовності дій (патерни атак),
що змінюються залежно від фази бою або здоров’я боса.
41
2.3.3. Проєктування інтерфейсу користувача
Інтерфейс користувача (UI) для "Curse of Gothicvania" розробляється з
урахуванням специфіки піксель-арт стилю та необхідності забезпечення хорошої
читабельності й зручності використання українською мовою.
Принципи дизайну UI:
1. Стилістична єдність: Усі елементи UI (вікна, кнопки, шрифти) виконуються в
піксельному стилі, що гармонує з загальною графікою гри. Використовуються
графічні асети (наприклад, з набору ‘FantasyWoodenGUI‘).
2. Мінімалізм та інформативність: HUD відображає лише найнеобхіднішу
інформацію (здоров’я, витривалість, можливо, поточний рівень та досвід), не
перевантажуючи екран.
3. Контекстуальність: Додаткові меню та інформаційні панелі з’являються лише за
потреби (меню паузи, інвентар, карта).
4. Читабельність українського тексту: Вибір піксельних шрифтів, що добре
підтримують кирилицю та забезпечують чіткість навіть при малих розмірах.
Використання TextMeshPro для покращеного рендерингу тексту.
5. Інтуїтивність навігації: Логічна структура меню та зрозумілі іконки (якщо
використовуються).
Структура елементів інтерфейсу (концептуально):
⎼ HUD (Heads-Up Display):
⎼ Індикатор здоров’я (наприклад, смуга або серця).
⎼ Індикатор витривалості.
⎼ Відображення рівня та досвіду персонажа.
⎼ Можливо, іконки активних ефектів або обраної зброї/навички.
42
⎼ Меню:
⎼ Головне меню: "Нова гра", "Продовжити", "Налаштування", "Вихід".
⎼ Меню паузи: "Продовжити", "Зберегти гру" (якщо передбачено ручне
збереження поза чекпоінтами), "Завантажити гру", "Налаштування", "Вихід в
головне меню".
⎼ Інвентар: Відображення зібраних предметів (реліквії, ключові предмети).
⎼ Карта: Схематичне відображення поточної локації з позначенням важливих
точок (якщо реалізується).
⎼ Налаштування: Опції для зміни гучності звуку/музики, можливо, параметрів
графіки (хоча для піксельної гри це менш актуально), перепризначення клавіш.
⎼ Діалогове вікно: Відображення тексту діалогів з NPC.
Таблиця 2.4 – Параметри доступності UI "Curse of Gothicvania" (пропозиції)
Функція Реалізація (пропозиції) Користь
Покращена читабельність
Можливість вибору розміру шрифту
Масштабування для гравців з різним
(малий/середній/великий) в
тексту UI зором та на різних
налаштуваннях
екранах
Забезпечення достатньої
Краща видимість для всіх
Контрастність UI контрастності між текстом та фоном
гравців
елементів UI
Зручність для гравців з
Перепризначення Повна кастомізація управління через різними уподобаннями та
клавіш нову систему вводу Unity фізичними
можливостями
Підказки до Відображення схеми управління в
Полегшення освоєння гри
елементів меню налаштувань або короткі
для нових гравців
керування підказки на початку гри
43
Рисунок 2.3 – Макет основного ігрового HUD "Curse of Gothicvania"
Усі текстові елементи інтерфейсу будуть реалізовані з підтримкою локалізації
через ‘LocalizationManager.cs‘, що дозволить легко відображати весь текст українською
мовою.
2.4. Специфікація вимог до гри
Формулювання чітких вимог до гри "Curse of Gothicvania" є критичним етапом, що
визначає технічні параметри, функціональні можливості та якісні характеристики
кінцевого продукту. Ці вимоги базуються на розробленій концепції гри.
Функціональні вимоги:
1. Геймплей та управління персонажем:
44
⎼ FR1: Гравець повинен мати можливість керувати головним героєм (Лицарем-
Героєм) у двовимірному просторі, включаючи рух (біг), стрибки, подвійний
стрибок (після отримання відповідної реліквії), ковзання по стінах, перекати та
блокування.
⎼ FR2: Бойова система повинна підтримувати щонайменше три типи базових
атак, щонайменше дві базові комбінації атак, та щонайменше дві позиційні
комбінації, що враховують положення гравця відносно ворога (фронт, фланг,
спина).
⎼ FR3: Взаємодія з елементами оточення повинна включати щонайменше три
типи інтеракцій (наприклад, руйнування об’єктів, активація механізмів,
використання елементів оточення проти ворогів).
⎼ FR4: Система прогресії персонажа повинна передбачати розвиток протягом 20
рівнів та отримання чотирьох унікальних навичок, пов’язаних зі збором
сюжетних реліквій.
⎼ FR5: У грі повинно бути реалізовано чотири унікальні ігрові локації, кожна з
власним набором ворогів, унікальними візуальними та геймплейними
механіками, та унікальним босом.
2. Управління даними та станом гри:
⎼ FR6: Гра повинна підтримувати систему збереження та завантаження прогресу
гравця, реалізовану через систему чекпоінтів.
⎼ FR7: Гравець повинен мати можливість налаштовувати основні параметри гри
(гучність звуку, музики, можливо, управління).
3. Інтерфейс користувача:
45
⎼ FR8: Увесь текстовий інтерфейс користувача (меню, підказки, діалоги, HUD)
повинен бути реалізований українською мовою.
⎼ FR9: HUD повинен чітко відображати ключові параметри гравця: поточне
здоров’я, витривалість, рівень та досвід.
Нефункціональні вимоги:
4. Продуктивність:
⎼ NFR1: Гра повинна забезпечувати стабільну частоту кадрів на рівні 60 FPS на
рекомендованому апаратному забезпеченні.
⎼ NFR2: Час завантаження кожної ігрової локації (сцени) не повинен
перевищувати 10-15 секунд.
⎼ NFR3: Загальне використання оперативної пам’яті грою не повинно
перевищувати 2 ГБ на рекомендованих налаштуваннях.
5. Юзабіліті (Зручність використання):
⎼ NFR4: Управління персонажем повинно бути інтуїтивно зрозумілим, з
можливістю ознайомлення зі схемою управління в грі.
⎼ NFR5: Гра повинна підтримувати управління як за допомогою клавіатури та
миші, так і за допомогою геймпада.
⎼ NFR6: Гра повинна надавати чіткі візуальні та звукові відгуки на дії гравця та
ключові ігрові події.
6. Надійність:
⎼ NFR7: Збережені дані гравця не повинні пошкоджуватися або втрачатися при
штатному завершенні роботи гри або при збоях живлення (в межах
можливостей системи чекпоінтів).
46
Технічні вимоги:
Таблиця 2.5 – Системні вимоги до гри "Curse of Gothicvania"
Параметр Мінімальні вимоги Рекомендовані вимоги
ОС Windows 10 (64-bit) Windows 10/11 (64-bit)
Intel Core i3 (4-го покоління або Intel Core i5 (6-го покоління або
Процесор новіший) / AMD Ryzen 3 (1-го новіший) / AMD Ryzen 5 (2-го
покоління або новіший) покоління або новіший)
RAM 4 ГБ 8 ГБ
Інтегрована графіка з Дискретна відеокарта NVIDIA
підтримкою DirectX 11 GeForce GTX 660 / AMD Radeon HD
Відеокарта
(наприклад, Intel HD Graphics 7870 (або еквівалентна з підтримкою
5000 / AMD Radeon R5 series) DirectX 11)
DirectX Версія 11 Версія 11
Місце на
500 МБ (орієнтовно) 1 ГБ (орієнтовно)
диску
Вимоги до процесу розробки:
⎼ Використання рушія Unity версії 2022.3 LTS або новішої.
⎼ Дотримання узгоджених стандартів кодування мовою C#.
⎼ Ведення коментарів та технічної документації коду англійською мовою.
⎼ Обов’язкове використання системи контролю версій Git для управління
проєктом.
Висновки до розділу 2
Проведений системний аналіз та детальне проєктування гри "Curse of Gothicvania"
дозволяють сформулювати наступні ключові висновки:
1. Застосування системного підходу до аналізу гри як складного інтерактивного
об’єкта дозволило чітко ідентифікувати її основні компоненти, підсистеми
(управління геймплеєм, візуалізація, ігрова логіка, штучний інтелект, управління
47
даними) та їхні взаємозв’язки. Така декомпозиція забезпечує необхідну
модульність архітектури, що є критично важливим для подальшої розробки,
тестування та потенційного розширення проєкту.
2. Розроблене концептуальне проєктування визначає унікальний ігровий досвід
"Curse of Gothicvania". Воно включає детальний опис похмурого фентезійного
світу Готикванії з чотирма різноманітними локаціями, гнучку систему розвитку
головного героя Лицаря-Героя з прогресією через рівні та розблокуванням
ключових навичок за допомогою сюжетних реліквій, а також інноваційну бойову
систему. Ця система базується на позиційних атаках, різноманітних комбінаціях,
захисних маневрах, управлінні витривалістю та активній взаємодії з елементами
ігрового оточення.
3. Спроєктована архітектура гри, що базується на компонентно-орієнтованому
підході рушія Unity, забезпечує високий рівень гнучкості та масштабованості.
Визначено основні класи та їх відповідальності, а також принципи їх взаємодії.
Застосування поширених патернів проєктування, таких як State Machine для
управління станами персонажів та Singleton для системних менеджерів, разом із
стандартними можливостями Unity (система фізики 2D, аніматор, система вводу),
сприятиме оптимізації та надійності критичних ігрових систем.
4. Дизайн інтерфейсу користувача розроблено з урахуванням принципів
мінімалізму, інформативності та стилістичної єдності з піксельною естетикою гри.
Особливу увагу приділено забезпеченню повної української локалізації всіх
текстових елементів UI, що є важливою вимогою проєкту.
5. Сформульовано детальний набір функціональних, нефункціональних та технічних
вимог до гри. Ці вимоги слугуватимуть чітким орієнтиром та критеріями якості на
етапі практичної реалізації проєкту. Особливий акцент зроблено на забезпеченні
48
стабільної продуктивності (60 FPS) та доступності гри для широкого кола гравців
з середніми за характеристиками комп’ютерами.
Результати системного аналізу та проєктування підтверджують технічну
реалістичність створення амбітного рольового ігрового проєкту "Curse of Gothicvania" з
унікальними механіками на платформі Unity. Це створює міцний фундамент для
наступних етапів розробки та потенційного успіху гри на ринку інді-проєктів.
49
3. МЕТОДИ ТА ЗАСОБИ РЕАЛІЗАЦІЇ ГРИ
3.1. Підходи до створення піксельної графіки та анімації
Візуальний стиль "Curse of Gothicvania" – це піксель-арт, що відповідає естетиці
16x16 тайлів для оточення та деталізованих спрайтів для персонажів. Як зазначалося,
проєкт використовує 17 професійних готових наборів графіки, що значно прискорює
створення контенту.
⎼ Використання готових графічних наборів:
⎼ Тайлсети для локацій: Графічні набори для Проклятого Міста, Покинутої
Церкви, Туманного Болота та Викривлених Печер є основою для створення
рівнів за допомогою системи Tilemap в Unity. Важливо правильно налаштувати
‘Pixels Per Unit‘ (PPU) для всіх спрайтів на 16 для узгодженості візуального
стилю. Фільтрацію текстур слід встановити на "Point (no filter)" для збереження
чіткості пікселів.
⎼ Спрайти персонажів та ворогів: Набори спрайтів для Лицаря-Героя, Бандитів
та інших монстрів надають готові анімаційні аркуші. Ці аркуші нарізаються на
окремі кадри за допомогою Sprite Editor в Unity (режим "Multiple", нарізка по
сітці або автоматично).
⎼ Декорації та ефекти: Набори декорацій для селищ, магічних ефектів та вибухів
використовуються для наповнення рівнів деталями та створення візуальних
ефектів для атак, магії, руйнувань.
⎼ Створення та налаштування анімацій в Unity:
⎼ Для кожного анімованого об’єкта (гравець, вороги) створюється Animator
Controller.
50
⎼ Анімаційні кліпи (Idle, Run, Attack1, Jump, Roll, Death тощо) створюються
шляхом перетягування послідовності кадрів спрайтів на шкалу часу Animation
в Unity. Ключові параметри, такі як швидкість відтворення (samples) та
зацикленість (loop time), налаштовуються для кожного кліпу.
⎼ Переходи між анімаційними станами налаштовуються в Animator Controller за
допомогою параметрів (наприклад, Float "Speed", Bool "IsGrounded", Trigger
"Attack", Integer "AttackCombo"). Наприклад, перехід від стану "Idle" до "Run"
відбувається, коли параметр "Speed" стає більшим за певне порогове значення
(наприклад, 0.1).
⎼ Анімаційні події (Animation Events): Використовуються для синхронізації
ігрової логіки з анімацією. Наприклад, подія в певному кадрі анімації атаки
може викликати функцію ‘DealDamage()‘ у скрипті персонажа для реєстрації
удару, або функцію відтворення звуку кроку під час анімації бігу.
⎼ Pixel Perfect Камера:
Для досягнення чіткого піксельного вигляду без розмиття чи артефактів
використовується компонент Pixel Perfect Camera в Unity. Налаштування, такі як
референсна роздільна здатність 320x180, PPU асетів 16, увімкнення опцій Upscale Render
Texture та Pixel Snapping, є критично важливими для правильного відображення.
⎼ Можлива кастомізація та створення нового арту:
Якщо виникає потреба в унікальних елементах, яких немає в готових наборах
(наприклад, специфічні іконки для UI, унікальні анімації для особливих комбо, які не
покриваються стандартним набором анімацій Лицаря-Героя), їх потрібно буде створити
вручну. Для цього використовуються редактори піксель-арту, такі як Aseprite. Важливо
51
дотримуватися загальної стилістики, палітри кольорів та розміру пікселя (16x16 для
базових елементів), щоб нові елементи органічно вписувалися в гру.
⎼ Паралакс-ефекти для фонів:
Фонові шари для локацій (наприклад, 3-4 шари для Міста, 3 шари з туманом для
Болота) реалізуються шляхом розміщення окремих спрайтів фону на різних відстанях
від камери по осі Z та написання простого скрипту, який рухає ці шари з різною
швидкістю відносно руху камери. Це створює ілюзію глибини та об’єму у 2D-світі.
Дотримання цих підходів дозволить створити візуально цілісний та привабливий
піксельний світ для "Curse of Gothicvania", використовуючи переваги готових наборів
графіки та потужних інструментів Unity для роботи з 2D-графікою та анімацією, як це
описано в багатьох сучасних посібниках з розробки ігор на Unity.
Висновки до розділу 3
Обґрунтування вибору платформи та інструментів розробки, а також детальний
опис методів реалізації ключових аспектів гри "Curse of Gothicvania" дозволяють
зробити наступні висновки:
1. Платформа Unity, разом із системою контролю версій Git, редактором коду Visual
Studio, новою системою вводу Unity та TextMeshPro, формує потужний та гнучкий
технологічний стек, оптимальний для розробки 2D піксельної RPG. Використання
17 професійних готових наборів графіки та анімацій значно прискорює процес
створення контенту та підвищує його якість.
2. Методи реалізації ігрових механік, таких як система руху персонажа (включаючи
стрибки, перекати, ковзання по стінах), багатогранна бойова система (з базовими
атаками, комбо, позиційною шкодою, захисними діями та системою
витривалості), взаємодія з оточенням та система прогресії персонажа, базуються
52
на ефективному використанні компонентів Unity (‘Rigidbody2D‘, ‘Animator‘),
скриптуванні на C# та застосуванні поширених патернів проєктування.
3. Алгоритми поведінки неігрових персонажів, зокрема ворогів, реалізуються за
допомогою машин станів, що керують їхньою реакцією на гравця (виявлення,
переслідування, атака) та взаємодією зі світом. Унікальні механіки локацій
(руйновані об’єкти, небезпечні зони, зміна гравітації) реалізуються через
спеціалізовані скрипти та взаємодію з фізичною системою Unity, додаючи глибину
та різноманітність ігровому процесу.
4. Підходи до створення піксельної графіки та анімації зосереджені на ефективному
використанні наданих готових наборів, правильному налаштуванні імпорту
спрайтів (PPU 16, фільтрація "Point"), створенні анімаційних кліпів та переходів в
Animator Controller, а також використанні компонента Pixel Perfect Camera для
досягнення чіткого та автентичного візуального стилю. Передбачена можливість
створення кастомних графічних елементів за потреби для забезпечення
унікальності проєкту.
Обрані методи та засоби реалізації є адекватними для досягнення поставлених у
проєкті "Curse of Gothicvania" цілей, забезпечуючи створення гри з глибоким геймплеєм,
унікальними механіками та привабливим візуальним стилем, що відповідає сучасним
тенденціям в інді-розробці.
53
4. ПРАКТИЧНА РЕАЛІЗАЦІЯ ГРИ
4.1. Налаштування середовища розробки та структура проєкту
Розробка гри "Curse of Gothicvania" розпочалася зі створення нового проєкту в
Unity Hub, обравши версію Unity 2022.3 LTS та шаблон "2D (URP)" (Universal Render
Pipeline). Використання URP дозволяє ефективніше керувати рендерингом та
застосовувати 2D освітлення та ефекти, що важливо для створення атмосферної
піксельної гри.
Налаштування проєкту включали:
1. Контроль версій: Ініціалізація Git-репозиторію для проєкту з самого початку
розробки. У налаштуваннях Unity (‘Edit → Project Settings → Editor‘) було
встановлено режим контролю версій на ‘Visible Meta Files‘ та серіалізацію асетів
на ‘Force Text‘ для кращої сумісності з Git.
2. Базові налаштування проєкту:
● У розділі ‘Player‘ (‘Edit → Project Settings → Player‘) було встановлено назву
компанії та продукту ("Curse of Gothicvania"), а також налаштовано стандартну
роздільну здатність екрана 1280x720 та віконний режим для зручності
тестування.
● У розділі ‘Graphics‘ було перевірено, що активним конвеєром рендерингу є
UniversalRenderPipelineAsset.
● У розділі ‘Quality‘ було оптимізовано налаштування для 2D-гри, зокрема
вимкнено Anti Aliasing для збереження чіткості піксельної графіки та
налаштовано VSync.
54
1. Pixel Perfect Camera: Для забезпечення чіткого відображення піксельної графіки
без артефактів масштабування, було створено та налаштовано об’єкт Pixel Perfect
Camera. Ключові параметри встановлено наступним чином: Assets PPU (Pixels Per
Unit) – 16, Reference Resolution – 320x180 (базова внутрішня роздільна здатність
гри), Upscale Render Texture – увімкнено, Pixel Snapping – увімкнено.
2. Physics 2D Settings: У налаштуваннях фізики 2D (‘Edit → Project Settings → Physics
2D‘) було встановлено значення гравітації по осі Y на -30 (для надання персонажу
відчутної "ваги" під час стрибків). Також було налаштовано матрицю зіткнень
шарів (Layer Collision Matrix) для коректної взаємодії між різними типами об’єктів
(гравець, вороги, земля, стіни тощо).
3. Tags and Layers: Були створені необхідні теги (наприклад, "Player", "Enemy",
"Ground", "Interactable") та шари (наприклад, "Player", "Enemy", "Ground", "Wall",
"UI") для організації об’єктів та налаштування їх взаємодії, зокрема фізичної.
Структура проєкту: Для забезпечення порядку та легкості навігації проєктом
була створена чітка та логічна файлова структура в папці ‘Assets/‘. Основні директорії
включають:
Assets/
├── _Project/ # Файли, створені безпосередньо для
гри
│ ├── Scripts/ # Скрипти C#
│ │ ├── Player/ # Скрипти, що стосуються гравця
│ │ ├── Enemy/ # Скрипти для ворогів
│ │ ├── Combat/ # Скрипти бойової системи
│ │ ├── UI/ # Скрипти для інтерфейсу
│ │ ├── Environment/ # Скрипти для елементів оточення
│ │ ├── Systems/ # Системні менеджери (гра, звук,
локалізація)
│ │ └── Utils/ # Допоміжні скрипти, розширення
│ ├── Prefabs/ # Готові об'єкти (префаби)
│ │ ├── Player/
│ │ ├── Enemies/
│ │ ├── Environment/
│ │ ├── UI/
55
│ │ └── Effects/
│ ├── Materials/ # Матеріали для спрайтів та ефектів
│ ├── Scenes/ # Ігрові сцени (рівні, меню)
│ ├── ScriptableObjects/ # ScriptableObject для даних
(характеристики гравця, ворогів)
│ │ ├── PlayerData.asset
│ │ └── EnemyData/
│ └── Settings/ # Конфігураційні файли (наприклад,
InputActions)
│ └── InputActions.inputactions
├── Imported/ # Імпортовані сторонні асети
│ ├── Ansimuz/ # Асети від розробника Ansimuz
│ ├── SvenThole/ # Асети від Sven Thole
│ ├── UI/ # Асети для UI (наприклад,
FantasyWoodenGUI)
│ └── Other/ # Інші імпортовані асети
├── Plugins/ # Плагіни (наприклад, TextMeshPro)
└── StreamingAssets/ # Асети, доступні для читання під
час виконання гри
└── Localization/ # Файли локалізації
└── uk-UA/ # Українська локалізація
Така структура дозволяє легко знаходити потрібні ресурси та підтримувати проєкт
в належному стані. Усі 17 професійних готових наборів графіки та анімацій були
імпортовані та організовані у відповідних підпапках всередині ‘Assets/Imported/‘.
Рисунок 4.1 – Скріншот структури папок проєкту "Curse of Gothicvania" в Unity
56
4.2. Реалізація основних систем гри
4.2.1. Система управління персонажем
Система управління головним героєм, Лицарем-Героєм, була реалізована за
допомогою скрипту ‘PlayerController.cs‘, який взаємодіє з компонентами ‘Rigidbody2D‘
та ‘Animator‘.
● Створення GameObject гравця: Було створено порожній GameObject з назвою
"Player". До нього були додані наступні компоненти: ‘SpriteRenderer‘ для
відображення графіки персонажа, ‘Animator‘ для керування анімаціями,
‘Rigidbody2D‘ для фізичної взаємодії, ‘CapsuleCollider2D‘ для визначення
фізичних меж персонажа, а також основні скрипти: ‘PlayerController.cs‘,
‘PlayerCombat.cs‘ та ‘PlayerStats.cs‘. Компонент ‘Rigidbody2D‘ було
налаштовано з масою 1, масштабом гравітації 3 (для відповідності загальній
гравітації сцени -30) та замороженим обертанням по осі Z. Розміри та зміщення
‘CapsuleCollider2D‘ були встановлені для відповідності візуальним розмірам
спрайта персонажа (наприклад, розмір (0.6, 1.2), зміщення (0,0)).
● Обробка вводу: Для обробки дій гравця була використана нова система вводу
Unity (Input System). Було створено асет ‘InputActions‘ з назвою
"PlayerControls", де визначено основні дії: "Move" (тип Vector2 для руху),
"Jump" (тип Button), "Attack" (Button), "Roll" (Button), "Block" (Button) та
"Interact" (Button). До GameObject гравця було додано компонент ‘PlayerInput‘
та пов’язано його з створеним асетом "PlayerControls".
● Логіка руху: Скрипт ‘PlayerController.cs‘ відповідає за реалізацію
горизонтального руху, стрибків (включаючи подвійний стрибок після
отримання відповідної реліквії) та перекатів.
57
csharp
// Фрагмент PlayerController.cs, що демонструє основні аспекти руху
using UnityEngine;
using UnityEngine.InputSystem; // Підключення нової системи вводу
public class PlayerController : MonoBehaviour
{
[Header("Movement Settings")]
[SerializeField] private float moveSpeed = 5f; // Швидкість
руху
[SerializeField] private float jumpForce = 12f; // Сила
стрибка
[SerializeField] private float rollSpeed = 8f; // Швидкість
перекату
[SerializeField] private float rollDuration = 0.5f; //
Тривалість перекату
[Header("Ground Check")]
[SerializeField] private Transform groundCheck; // Точка для
перевірки землі
[SerializeField] private float groundCheckRadius = 0.2f; //
Радіус перевірки
[SerializeField] private LayerMask groundLayer; // Шар, що
вважається землею
// Компоненти
private Rigidbody2D rb;
private Animator animator;
private SpriteRenderer spriteRenderer;
private PlayerInput playerInput;
// Змінні для системи вводу
private InputAction moveAction;
private InputAction jumpAction;
private InputAction rollAction;
// Змінні стану
private float horizontalInput;
private bool isGrounded;
private bool isRolling = false;
private bool canMove = true; // Дозволяє блокувати рух під час
певних дій
// Для подвійного стрибка
private bool canDoubleJump = false; // Чи доступний подвійний
стрибок (активується реліквією)
private bool hasDoubleJumped = false; // Чи був вже виконаний
подвійний стрибок
58
void Awake()
{
rb = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
spriteRenderer = GetComponent<SpriteRenderer>();
playerInput = GetComponent<PlayerInput>();
// Отримання посилань на дії з асету InputActions
moveAction = playerInput.actions["Move"];
jumpAction = playerInput.actions["Jump"];
rollAction = playerInput.actions["Roll"];
}
void Update()
{
if (!canMove) return; // Якщо рух заблоковано, виходимо
// Обробка горизонтального вводу
horizontalInput = moveAction.ReadValue<Vector2>().x;
// Перевірка стану "на землі"
isGrounded = Physics2D.OverlapCircle(groundCheck.position,
groundCheckRadius, groundLayer);
if (isGrounded)
{
hasDoubleJumped = false; // Скидання прапорця подвійного
стрибка при торканні землі
}
// Поворот спрайта персонажа
if (Mathf.Abs(horizontalInput) > 0.01f && !isRolling)
{
spriteRenderer.flipX = horizontalInput < 0;
}
// Обробка стрибка
if (jumpAction.triggered)
{
if (isGrounded) // Перший стрибок
{
rb.velocity = new Vector2(rb.velocity.x, 0f); //
Обнулення вертикальної швидкості
rb.AddForce(new Vector2(0f, jumpForce),
ForceMode2D.Impulse);
animator.SetTrigger("Jump");
}
else if (canDoubleJump && !hasDoubleJumped) // Подвійний
стрибок
{
59
hasDoubleJumped = true;
rb.velocity = new Vector2(rb.velocity.x, 0f); //
Обнулення вертикальної швидкості
rb.AddForce(new Vector2(0f, jumpForce \textit{
0.8f), ForceMode2D.Impulse); // Подвійний стрибок може бути слабшим
animator.SetTrigger("Jump"); // Можна мати окрему
анімацію для подвійного стрибка
}
}
// Обробка перекату
if (rollAction.triggered && isGrounded && !isRolling)
{
StartCoroutine(RollCoroutine());
}
UpdateAnimations(); // Оновлення параметрів аніматора
}
void FixedUpdate()
{
if (!canMove || isRolling) // Якщо рух заблоковано або
персонаж в перекаті
{
if(isRolling) // Дозволяємо рух під час перекату, якщо
він керується швидкістю
{
float rollDirection = spriteRenderer.flipX ? -1f :
1f;
rb.velocity = new Vector2(rollDirection } rollSpeed,
rb.velocity.y);
}
return;
}
// Застосування горизонтального руху
rb.velocity = new Vector2(horizontalInput \textit{
moveSpeed, rb.velocity.y);
}
void UpdateAnimations()
{
animator.SetFloat("Speed", Mathf.Abs(horizontalInput));
animator.SetBool("IsGrounded", isGrounded);
animator.SetFloat("VelocityY", rb.velocity.y); // Для
анімацій стрибка/падіння
}
System.Collections.IEnumerator RollCoroutine()
60
{
isRolling = true;
animator.SetTrigger("Roll"); // Запуск анімації перекату
// Тут можна додати логіку невразливості під час перекату
// gameObject.layer = LayerMask.NameToLayer("Invulnerable");
// Приклад зміни шару
// Зберігаємо початкову швидкість та напрямок для контролю
під час перекату
// float rollDirection = spriteRenderer.flipX ? -1f : 1f;
// rb.velocity = new Vector2(rollDirection } rollSpeed, 0f);
// Застосовуємо швидкість перекату
yield return new WaitForSeconds(rollDuration); // Очікування
завершення перекату
isRolling = false;
// Повернення гравця на початковий шар
// gameObject.layer = LayerMask.NameToLayer("Player");
}
// Метод для активації можливості подвійного стрибка
(викликається, наприклад, GameManager'ом)
public void EnableDoubleJump(bool enabled)
{
canDoubleJump = enabled;
}
}
● Анімації гравця: Було налаштовано Animator Controller з назвою
"PlayerAnimator". У ньому створено параметри: ‘Speed‘ (Float), ‘IsGrounded‘
(Bool), ‘VelocityY‘ (Float), ‘Jump‘ (Trigger), ‘Attack‘ (Trigger), ‘Roll‘ (Trigger),
‘Hurt‘ (Trigger), ‘AttackCombo‘ (Integer). Було створено анімаційні стани (Idle,
Run, Jump, Fall, Attack1, Attack2, Attack3, Roll, Block, Hurt, Death) на основі
нарізаних спрайтів з графічного набору для Лицаря-Героя та налаштовано
переходи між ними відповідно до значень параметрів.
61
4.2.2. Система бою
Бойова система була реалізована у скрипті ‘PlayerCombat.cs‘ та тісно інтегрована
з анімаційною системою гравця.
● Атаки та комбо: Скрипт ‘PlayerCombat.cs‘ відстежує натискання кнопки атаки.
Для реалізації комбо використовуються змінні ‘comboCounter‘ (лічильник атак
у комбо) та ‘lastAttackTime‘ разом з ‘comboWindow‘ (часове вікно для
продовження комбо). При кожній успішній атаці встановлюється тригер
"Attack" та оновлюється параметр "AttackCombo" в аніматорі для відтворення
відповідної анімації атаки (Attack1, Attack2 або Attack3).
● Нанесення шкоди: У ключових кадрах анімацій атаки розміщено анімаційні
події, які викликають публічний метод ‘DealDamageEvent()‘ у скрипті
‘PlayerCombat.cs‘. Цей метод використовує ‘Physics2D.OverlapCircleAll‘ для
виявлення ворожих об’єктів (що знаходяться на шарі "Enemy") у невеликій зоні
перед гравцем (визначеній об’єктом ‘attackPoint‘ та радіусом ‘attackRange‘).
● Позиційна шкода: У методі ‘DealDamageEvent()‘ (або в окремому методі, що
ним викликається) реалізовано логіку ‘CalculatePositionalDamageMultiplier()‘.
Цей метод аналізує відносне положення гравця та ворога, а також напрямок
атаки, щоб визначити, чи була атака нанесена спереду, з флангу або зі спини
ворога, та застосовує відповідний множник шкоди (x1.0, x1.25 або x1.5).
csharp
// Фрагмент PlayerCombat.cs, що демонструє логіку атаки та нанесення
шкоди
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerCombat : MonoBehaviour
{
[Header("Combat Settings")]
62
[SerializeField] private float baseAttackDamage = 10f; // Базова
шкода гравця
[SerializeField] private Transform attackPoint; // Точка, з
якої виходить атака
[SerializeField] private float attackRange = 0.5f; // Радіус
атаки
[SerializeField] private LayerMask enemyLayers; // Шари, на
яких знаходяться вороги
[Header("Combo Settings")]
[SerializeField] private float comboWindow = 0.7f; // Час для
продовження комбо
private int comboCounter = 0; // Лічильник атак у
поточному комбо
private float lastAttackTime = 0f; // Час останньої атаки
private Animator animator;
private PlayerInput playerInput;
private PlayerStats playerStats; // Для отримання бонусів до
шкоди, якщо є
void Awake()
{
animator = GetComponent<Animator>();
playerInput = GetComponent<PlayerInput>();
playerStats = GetComponent<PlayerStats>(); // Припускаємо,
що такий скрипт є
// Підписка на подію "Attack" з нової системи вводу
if (playerInput.actions["Attack"] != null)
{
playerInput.actions["Attack"].performed += context =>
PerformAttack();
}
}
void PerformAttack()
{
// Перевірка, чи може гравець атакувати (наприклад, не в
стані перекату, достатньо витривалості)
// Приклад: if
(GetComponent<PlayerController>().IsRolling()) return;
if (Time.time - lastAttackTime > comboWindow || comboCounter
>= 3)
{
comboCounter = 0; // Скидання комбо, якщо час вийшов або
досягнуто ліміту
}
63
comboCounter++;
animator.SetInteger("AttackCombo", comboCounter); //
Встановлення параметра для аніматора (1, 2, або 3)
animator.SetTrigger("Attack"); // Запуск
анімації атаки
lastAttackTime = Time.time; // Оновлення часу останньої
атаки
}
// Цей метод викликається через Animation Event з анімацій атаки
public void DealDamageEvent()
{
Collider2D[] hitEnemies =
Physics2D.OverlapCircleAll(attackPoint.position, attackRange,
enemyLayers);
foreach (Collider2D enemyCollider in hitEnemies)
{
EnemyBase enemy =
enemyCollider.GetComponent<EnemyBase>();
if (enemy != null && !enemy.IsDead()) // Перевірка, чи
ворог ще живий
{
float currentDamage = baseAttackDamage;
if (playerStats != null)
{
currentDamage += playerStats.GetBonusDamage();
// Додавання бонусів від статистики
}
// Розрахунок позиційного модифікатора шкоди
float positionalMultiplier =
CalculatePositionalDamageMultiplier(enemy.transform);
float finalDamage = currentDamage \textit{
positionalMultiplier;
enemy.TakeDamage(finalDamage, transform.position);
// Передаємо фінальну шкоду та позицію атакуючого
}
}
}
// Метод для розрахунку множника позиційної шкоди
private float CalculatePositionalDamageMultiplier(Transform
target)
{
// Напрямок, куди дивиться ворог
64
Vector2 enemyForward = target.right } (target.localScale.x >
0 ? 1f : -1f);
// Вектор від ворога до гравця (напрямок, звідки прийшла
атака відносно ворога)
Vector2 attackDirectionFromEnemyPerspective =
(transform.position - target.position).normalized;
float angle = Vector2.Angle(enemyForward,
attackDirectionFromEnemyPerspective);
if (angle <= 45f) // Атака прийшла спереду ворога
{
return 1.0f; // Фронт
}
else if (angle >= 135f) // Атака прийшла зі спини ворога
{
return 1.5f; // Спина
}
else // Атака прийшла збоку ворога
{
return 1.25f; // Фланг
}
}
// Візуалізація зони атаки в редакторі для зручності
налаштування
void OnDrawGizmosSelected()
{
if (attackPoint == null) return;
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(attackPoint.position, attackRange);
}
}
● Вороги: Було створено базовий клас ‘EnemyBase.cs‘, який містить спільні для
всіх ворогів властивості та методи (наприклад, здоров’я, отримання шкоди,
смерть). Для кожного конкретного типу ворога (наприклад, Бандит) було
створено окремий клас (наприклад, ‘BanditAI.cs‘), що успадковує ‘EnemyBase‘
та реалізує унікальну логіку поведінки (патрулювання, переслідування, атака)
та керує відповідними анімаціями.
65
Рисунок 4.2 – Скріншот налаштувань Animator Controller для гравця з переходами між
атаками
4.2.3. Системи інвентаря та предметів
На поточному етапі реалізації основний акцент було зроблено на механіці збору
ключових сюжетних предметів – реліквій. Повноцінна система інвентарю для великої
кількості предметів не була першочерговим завданням, але закладено основи для її
можливого розширення.
⎼ Збір реліквій: Реліквії представлені у грі як унікальні об’єкти. При контакті
гравця з об’єктом реліквії (через колайдер-тригер та метод ‘OnTriggerEnter2D‘),
відповідна реліквія "додається" до гравця. Це реалізовано шляхом
встановлення булевого прапорця у скрипті ‘PlayerStats‘ або ‘GameManager‘, що
позначає наявність реліквії. Отримання реліквії також активує відповідну
унікальну навичку для гравця (наприклад,
‘playerController.EnableDoubleJump(true);‘).
66
⎼ Інші предмети: Було передбачено можливість збору інших предметів, таких як
витратні матеріали (наприклад, зілля для відновлення здоров’я) або предмети
для виконання завдань (якщо такі будуть додані). Їх збір реалізується
аналогічно до реліквій, з відповідним записом у стані гравця або спеціальному
списку предметів.
⎼ Відображення ключових предметів: Наразі не реалізовано окремого вікна
інвентарю, але інформація про зібрані реліквії може відображатися на HUD або
в спеціальному розділі меню паузи.
Для майбутнього розширення системи інвентарю планується використання
‘ScriptableObject‘ для опису кожного типу предмета (його назва, опис, іконка, ефект при
використанні). Також будуть створені класи для слотів інвентарю та менеджер
інвентарю, який керуватиме логікою додавання, видалення, сортування та використання
предметів.
4.3. Реалізація ігрових рівнів та світу
Чотири основні ігрові локації ("Прокляте Місто", "Покинута Церква", "Туманне
Болото", "Викривлені Печери") були створені з використанням системи Tilemap в Unity,
що дозволяє ефективно будувати рівні з 2D-тайлів.
⎼ Створення сцен: Для кожної з чотирьох локацій було створено окрему ігрову
сцену (наприклад, ‘Town.unity‘, ‘Church.unity‘, ‘Swamp.unity‘, ‘Caves.unity‘). Це
дозволяє оптимізувати завантаження та керувати контентом кожної локації
незалежно.
⎼ Робота з Tilemaps: У кожній сцені було створено об’єкт Grid, до якого додано
декілька шарів Tilemap для різних цілей:
67
⎼ ‘Tilemap_Background‘: для розміщення фонових елементів, що створюють
атмосферу та глибину.
⎼ ‘Tilemap_Decorations‘ (або ‘Tilemap_Midground‘): для декоративних елементів,
з якими гравець не взаємодіє фізично, але які додають деталізацію світу.
⎼ ‘Tilemap_Collision‘ (або ‘Tilemap_GroundAndWalls‘): основний шар, що формує
фізичні межі рівня (земля, стіни, платформи). До цього шару було додано
компонент ‘TilemapCollider2D‘ для забезпечення фізичної взаємодії з
персонажами. Цей шар було налаштовано на відповідний фізичний шар
("Ground" або "Wall").
⎼ ‘Tilemap_Foreground‘: для елементів, що повинні відображатися перед гравцем
та іншими персонажами (наприклад, колони, кущі).
⎼ Тайл-палітри (Tile Palettes): Для кожного графічного набору тайлів (наприклад,
тайлсет для Проклятого Міста) було створено відповідну Tile Palette в Unity. Це
дозволило зручно "малювати" рівні, обираючи потрібні тайли та розміщуючи
їх на відповідних шарах Tilemap.
⎼ Розміщення ігрових об’єктів: На створених рівнях були розміщені префаби
гравця (стартова позиція), ворогів різних типів, інтерактивних об’єктів
(наприклад, руйновані бочки, скрині з скарбами з відповідних графічних
наборів), а також об’єкти для системи чекпоінтів та тригери для переходів між
різними сценами або частинами рівня.
⎼ Паралакс-скролінг для фонів: Для створення ефекту глибини та об’єму було
використано декілька шарів фонових зображень. Ці шари рухаються з різною
швидкістю відносно руху камери, що реалізовано за допомогою спеціального
скрипту ‘ParallaxBackground.cs‘, який динамічно змінює позицію фонових
шарів.
68
Рисунок 4.3 – Скріншот редактора Tilemap в Unity з прикладом рівня "Прокляте Місто"
⎼ Реалізація унікальних механік локацій:
⎼ Прокляте Місто: Розміщено руйновані барикади як окремі об’єкти зі скриптом
‘DestructibleObject.cs‘, який відстежує їх здоров’я та руйнує об’єкт при
отриманні достатньої шкоди.
⎼ Покинута Церква: Створено зони, що імітують дію святої води (можливо, через
тригери, які завдають шкоди ворогам типу "нежить" або надають гравцю
тимчасовий бонус). Благословенні платформи можуть бути реалізовані як
платформи, що з’являються або активуються за певних умов.
⎼ Туманне Болото: Ефект отруйного туману реалізовано за допомогою системи
частинок Unity для візуалізації та тригерної зони, яка поступово завдає шкоди
гравцю, доки він у ній перебуває. Потопаючі платформи реалізовані як
платформи зі скриптом, який змушує їх зникати або опускатися під воду через
деякий час після того, як гравець на них наступає.
⎼ Викривлені Печери: Зони з модифікованою гравітацією створені за допомогою
компонента ‘PointEffector2D‘ або через скрипти, що локально змінюють вектор
69
‘Physics2D.gravity‘ або діють на ‘Rigidbody2D‘ гравця. Портали телепортації
реалізовані як тригери, що при входженні гравця переміщують його в іншу,
наперед задану точку на рівні або навіть на інший рівень.
4.4. Створення піксельної графіки та анімації
Оскільки проєкт значною мірою спирається на використання великої кількості
готових професійних графічних наборів, основна робота в цьому напрямку полягала в їх
правильній інтеграції, налаштуванні та адаптації до потреб гри.
⎼ Імпорт та налаштування спрайтів: Усі графічні ресурси (спрайти персонажів,
ворогів, тайлсети, об’єкти оточення, ефекти) були імпортовані в проєкт Unity.
Для кожного спрайту було встановлено відповідні налаштування імпорту для
забезпечення коректного відображення піксельної графіки:
⎼ Texture Type: ‘Sprite (2D and UI)‘.
⎼ Sprite Mode: ‘Multiple‘ (для анімаційних аркушів та тайлсетів, які потребують
нарізки), ‘Single‘ (для окремих спрайтів, наприклад, іконок).
⎼ Pixels Per Unit (PPU): Встановлено значення ‘16‘ для всіх ігрових спрайтів, щоб
забезпечити єдиний масштаб та коректну роботу Pixel Perfect Camera.
⎼ Filter Mode: ‘Point (no filter)‘ для збереження чіткості пікселів без розмиття.
⎼ Compression: ‘None‘ для максимальної якості зображення, особливо важливої
для піксель-арту.
⎼ Нарізка спрайтів (Sprite Slicing): Анімаційні аркуші (наприклад, для Лицаря-
Героя або Бандитів) та тайлсети були нарізані на окремі спрайти (кадри анімації
або окремі тайли) за допомогою вбудованого інструменту Sprite Editor в Unity.
Використовувалися методи нарізки "Grid By Cell Size" (для тайлсетів з
70
фіксованим розміром тайла 16x16) або "Grid By Cell Count" (для анімаційних
аркушів, де відома кількість кадрів по горизонталі та вертикалі).
⎼ Створення та налаштування анімацій:
⎼ Для кожного анімованого персонажа (гравець, вороги) та деяких об’єктів було
створено Animation Clips в редакторі Animation Unity. Це включає анімації
простою (Idle), бігу (Run), стрибка (Jump), падіння (Fall), різних типів атак
(Attack1, Attack2, Attack3), перекату (Roll), блокування (Block), отримання
шкоди (Hurt), смерті (Death) тощо.
⎼ Швидкість відтворення (Samples) та параметри зациклювання (Loop Time) були
налаштовані для кожного анімаційного кліпу індивідуально для досягнення
бажаного ефекту.
⎼ Було створено Animator Controllers для керування переходами між різними
анімаційними станами. У Animator Controller було визначено параметри (Float,
Int, Bool, Trigger), які використовуються у скриптах для керування анімаціями
(наприклад, параметр "Speed" для переходу між Idle та Run, тригер "Attack" для
запуску анімації атаки).
⎼ Анімаційні події (Animation Events) були додані до ключових кадрів анімацій
(наприклад, в момент удару в анімації атаки) для виклику відповідних методів
у скриптах (наприклад, ‘DealDamageEvent()‘ для реєстрації шкоди).
⎼ Реалізація візуальних ефектів: Для створення візуальних ефектів (постріли,
вибухи, удари, магічні ефекти) були використані готові набори графіки. Ефекти
були реалізовані або як покадрові анімації (створені з послідовності спрайтів
ефекту), або як системи частинок Unity (Particle Systems), налаштовані для
відповідності піксельному стилю. Готові ефекти були збережені як префаби та
71
інстанціювалися у грі в потрібні моменти (наприклад, при влучанні атаки або
знищенні ворога).
Рисунок 4.4. – Приклад налаштування анімаційного кліпу "Attack1" для гравця в
редакторі Animation Unity
Хоча основна частина графіки була взята з готових наборів, у процесі розробки
могла виникнути потреба у створенні або модифікації окремих елементів (наприклад,
унікальних іконок для UI, специфічних індикаторів). Такі елементи створювалися б
вручну з дотриманням загальної стилістики гри.
4.5. Реалізація інтерфейсу користувача
Інтерфейс користувача (UI) для "Curse of Gothicvania" був розроблений з
використанням стандартної системи Unity UI та стилізований за допомогою графічного
набору ‘FantasyWoodenGUI‘ для відповідності готичній фентезійній атмосфері гри.
Важливою вимогою була повна українська локалізація.
⎼ Структура Canvas: Було створено один або декілька об’єктів Canvas для
розміщення елементів UI. Основний Canvas для HUD (Heads-Up Display) та
окремий Canvas для меню (головне меню, меню паузи, налаштування).
Компонент ‘Canvas Scaler‘ було налаштовано на режим "Scale With Screen Size"
72
з референсною роздільною здатністю (наприклад, 1280x720, або 320x180, якщо
UI також має бути чітко піксельним і масштабуватися разом з грою), щоб
забезпечити коректне відображення UI на екранах з різною роздільною
здатністю.
⎼ Елементи HUD:
⎼ Індикатор здоров’я гравця було реалізовано за допомогою компонента ‘Slider‘
та скрипту ‘HealthBar.cs‘, який оновлює значення слайдера відповідно до
поточного та максимального здоров’я гравця. Заповнення слайдера (Fill) було
стилізовано для відповідності темі.
⎼ Текстові поля для відображення рівня гравця, кількості досвіду та, можливо,
інших важливих параметрів (наприклад, витривалості) було реалізовано за
допомогою компонента TextMeshPro для забезпечення високої якості та
чіткості піксельних шрифтів, особливо з українськими символами.
⎼ Меню гри:
⎼ Головне меню: Було створено окрему сцену або UI-панель для головного меню,
що містить кнопки "Нова гра", "Продовжити", "Налаштування", "Вихід".
⎼ Меню паузи: Реалізовано як UI-панель, що з’являється при натисканні
відповідної кнопки під час гри, з опціями "Продовжити", "Зберегти гру" (якщо
реалізовано), "Завантажити гру", "Налаштування", "Вихід в головне меню".
⎼ Кнопки та інші інтерактивні елементи меню отримали відповідні скрипти для
обробки натискань та виконання відповідних дій (запуск нової гри,
завантаження сцени, зміна налаштувань).
⎼ Локалізація UI:
73
⎼ Було реалізовано систему локалізації на основі скрипту
‘LocalizationManager.cs‘. Цей менеджер відповідає за завантаження текстових
рядків з JSON-файлів, розміщених у папці ‘StreamingAssets/Localization/uk-
UA/‘. Кожен JSON-файл містить пари "ключ-значення" для різних елементів UI
(наприклад, ‘UI.json‘ для загальних елементів меню та HUD, ‘Dialogs.json‘ для
діалогів тощо).
⎼ Усі текстові компоненти в UI (на кнопках, заголовках, підказках) отримують
свій текст динамічно під час ініціалізації через виклик методу
‘LocalizationManager.Instance.GetLocalizedValue("ключ_тексту")‘. Це
забезпечує відображення всього інтерфейсу українською мовою.
csharp
// Приклад використання LocalizationManager у скрипті для елемента
UI
using UnityEngine;
using TMPro; // Використання TextMeshPro
public class LocalizedTextUI : MonoBehaviour
{
public string localizationKey; // Ключ для пошуку тексту в JSON-
файлі
private TextMeshProUGUI textComponent;
void Start()
{
textComponent = GetComponent<TextMeshProUGUI>();
UpdateText();
}
// Метод для оновлення тексту, може викликатися при зміні мови
public void UpdateText()
{
if (textComponent != null && LocalizationManager.Instance !=
null)
{
textComponent.text =
LocalizationManager.Instance.GetLocalizedValue(localizationKey);
}
else if (textComponent != null)
{
74
textComponent.text = localizationKey; // Запасний
варіант, якщо менеджер не знайдено
Debug.LogWarning(\$"LocalizationManager not found or
text component missing for key: {localizationKey}");
}
}
}
Цей скрипт можна прикріпити до будь-якого GameObject з компонентом
TextMeshProUGUI та вказати ключ локалізації в інспекторі.
Розробка UI також включала налаштування інтерактивності елементів (переходи
між станами кнопок: Normal, Highlighted, Pressed, Disabled) та їх правильне розміщення
на екрані за допомогою системи прив’язок (Anchors) та опорних точок (Pivot) у
RectTransform.
4.6. Тестування та налагодження
Тестування та налагодження були невід’ємною частиною процесу розробки "Curse
of Gothicvania" і проводилися ітеративно на всіх етапах.
⎼ Модульне тестування (Unit Testing): Окремі компоненти та системи
(наприклад, логіка руху гравця, система комбо-атак, штучний інтелект окремих
типів ворогів, система розрахунку шкоди) тестувалися в ізольованих умовах
або у спеціально створених тестових сценах. Це дозволяло швидко перевіряти
працездатність конкретного функціоналу та виправляти помилки на ранніх
стадіях.
⎼ Інтеграційне тестування: Після розробки декількох взаємопов’язаних систем
проводилося тестування їх спільної роботи. Наприклад, перевірялася
коректність взаємодії системи управління персонажем з бойовою системою, а
також взаємодія гравця з ворогами та інтерактивними елементами оточення.
75
⎼ Ігрове тестування (Playtesting): Регулярне проходження створених ігрових
рівнів та сценаріїв проводилося для виявлення помилок у логіці гри, проблем з
балансом складності, недоліків у дизайні рівнів (наприклад, місця, де гравець
може застрягнути, або незрозумілі завдання), а також для оцінки загального
ігрового досвіду.
⎼ Налагодження (Debugging): Для виявлення та виправлення помилок у коді
активно використовувалися вбудовані інструменти Unity:
⎼ Виведення інформації в консоль за допомогою ‘Debug.Log()‘,
‘Debug.Warning()‘ та ‘Debug.Error()‘ для відстеження значень змінних та ходу
виконання програми.
⎼ Використання Unity Debugger, інтегрованого з середовищем розробки
(наприклад, Visual Studio), для покрокового виконання коду, встановлення
точок зупину (breakpoints) та аналізу стека викликів і значень змінних у
реальному часі.
⎼ Інструмент Unity Profiler для моніторингу продуктивності гри (навантаження
на CPU, GPU, використання пам’яті, кількість викликів Draw Calls) та
виявлення "вузьких місць", що потребують оптимізації.
⎼ Вирішення поширених проблем: У процесі розробки зверталася увага на типові
проблеми, що виникають при створенні 2D-ігор:
⎼ Розмиття піксельної графіки: Контролювалося через правильні налаштування
імпорту спрайтів (Filter Mode: Point), коректне використання Pixel Perfect
Camera та відповідне значення PPU для всіх графічних асетів.
⎼ Проблеми з фізикою (персонаж провалюється крізь землю, некоректні
зіткнення): Вирішувалися шляхом ретельної перевірки наявності та
76
налаштувань колайдерів на всіх фізичних об’єктах, коректного налаштування
шарів (Layers) та матриці зіткнень шарів (Layer Collision Matrix).
⎼ Проблеми з анімаціями (анімації не відтворюються, відтворюються
некоректно): Перевірялися налаштування Animator Controller (параметри,
умови переходів між станами), а також правильність виклику тригерів та
встановлення значень параметрів аніматора у скриптах.
⎼ Балансування ігрового процесу: Після реалізації основних механік та контенту
проводилося балансування складності гри. Це включало налаштування
характеристик гравця (здоров’я, шкода, швидкість відновлення витривалості),
характеристик ворогів (здоров’я, шкода, швидкість руху, агресивність),
складності босів, а також частоти появи корисних предметів або чекпоінтів.
Процес тестування та налагодження є циклічним і триває протягом усього
життєвого циклу розробки, аж до фінального релізу гри, з метою забезпечення
максимально якісного та стабільного ігрового досвіду.
Висновки до розділу 4
Практична реалізація ключових аспектів гри "Curse of Gothicvania"
продемонструвала ефективність обраних підходів, інструментів та проєктних рішень,
закладених на етапах аналізу та проєктування.
1. Налаштування середовища та структури проєкту: Успішне налаштування проєкту
в Unity 2022.3 LTS (URP), інтеграція з системою контролю версій Git та створення
чіткої, організованої структури папок та файлів забезпечили міцний фундамент
для ефективної та керованої розробки. Використання 17 професійних готових
наборів графіки було систематизовано шляхом їх імпорту у відповідні директорії.
77
2. Реалізація основних ігрових систем: Ключові системи гри, такі як система
управління персонажем (що включає рух, стрибки, подвійний стрибок, перекати
та взаємодію з оточенням, з використанням нової системи вводу Unity),
комплексна бойова система (з різними типами атак, комбінаціями, механікою
позиційної шкоди, блокуванням та системою витривалості), а також базова
система штучного інтелекту для ворогів (на основі машин станів), були успішно
реалізовані за допомогою скриптів на C# та ефективного використання
компонентів рушія Unity. Приклади коду, наведені в розділі, ілюструють ключові
аспекти цієї реалізації.
3. Розробка ігрових рівнів та світу: Чотири заплановані ігрові локації були створені
з використанням системи Tilemap, що дозволило ефективно конструювати рівні з
2D-тайлів, наданих у графічних наборах. Інтеграція унікальних геймплейних
механік для кожної локації (руйновані об’єкти, небезпечні зони, зміна гравітації,
потопаючі платформи, портали) додала глибини та різноманітності ігровому світу.
Паралакс-скролінг фонів посилив відчуття об’єму.
4. Створення графіки та анімації: Успішна інтеграція та налаштування піксельної
графіки з готових наборів, включаючи правильний імпорт спрайтів (PPU 16,
фільтрація "Point"), нарізку анімаційних аркушів, створення анімаційних кліпів та
налаштування Animator Controllers для гравця та ворогів, дозволили досягти
запланованого візуального стилю. Використання Pixel Perfect Camera забезпечило
чіткість зображення.
5. Реалізація інтерфейсу користувача: Інтерфейс користувача, включаючи HUD та
елементи меню, був реалізований за допомогою системи Unity UI та стилізований
з використанням відповідного графічного набору. Важливим досягненням є
реалізація системи локалізації, що забезпечує повне відображення текстових
елементів UI українською мовою.
78
6. Тестування та налагодження: Постійний ітеративний процес тестування
(модульного, інтеграційного, ігрового) та налагодження за допомогою
інструментів Unity дозволив своєчасно виявляти та виправляти помилки, а також
проводити початкове балансування ігрового процесу та оптимізацію
продуктивності.
Результати практичної реалізації підтверджують, що обраний технологічний стек
та методологія розробки є адекватними для створення функціонального та візуально
привабливого ігрового продукту, що відповідає початковій концепції "Curse of
Gothicvania". Закладено основу для подальшого розширення контенту, додавання нових
функцій та фінального полірування гри перед потенційним релізом.
79
ВИСНОВКИ
У ході виконання даної кваліфікаційної роботи було досягнуто поставленої мети –
розроблено концепцію та ключові елементи фентезійної рольової комп’ютерної гри
"Curse of Gothicvania" в піксельному 2D стилі на платформі Unity, з акцентом на
унікальні бойові механіки.
Було вирішено наступні завдання:
1. Проведено аналіз ринку рольових ігор, який підтвердив актуальність та
комерційний потенціал піксельних 2D RPG, особливо з інноваційними
механіками. Визначено основні тенденції розвитку жанру, такі як гібридизація,
ускладнення геймплею та високі вимоги до візуального стилю.
2. Досліджено існуючі бойові системи в 2D піксельних RPG, що дозволило
сформувати вимоги до власної системи, яка б поєднувала динаміку, тактичну
глибину через позиціонування, комбо-атаки та взаємодію з оточенням.
3. Проаналізовано платформи розробки ігор, і обґрунтовано вибір Unity як
оптимальної платформи завдяки її потужним інструментам для 2D-розробки,
великій спільноті, кросплатформеності та доступності ресурсів в Asset Store.
4. Розроблено детальну концепцію гри "Curse of Gothicvania", що включає опис
ігрового світу з чотирма унікальними локаціями, систему персонажа та його
прогресії, а також деталізацію унікальних бойових механік (позиційна шкода,
комбо-система, захисні маневри, система витривалості, взаємодія з оточенням).
5. Спроєктовано архітектуру гри на основі компонентно-орієнтованого підходу
Unity, визначено ключові компоненти, їх взаємодію, основні структури даних та
алгоритми. Розроблено концепцію українськомовного інтерфейсу користувача.
Сформульовано функціональні, нефункціональні та технічні вимоги до гри.
80
6. Описано методи та засоби реалізації ключових ігрових систем: управління
персонажем (з використанням нового Input System Unity), бойової системи,
системи ворожого ШІ (на основі машин станів), а також підходи до створення
піксельної графіки, анімації та рівнів з використанням наданих графічних наборів
та інструментів Unity.
7. Продемонстровано практичну реалізацію основних компонентів гри "Curse of
Gothicvania", включаючи налаштування проєкту, створення скриптів для
персонажа та ворогів, розробку рівнів за допомогою Tilemap, інтеграцію анімацій
та українськомовного UI, а також описано процес тестування та налагодження.
Наукова новизна роботи полягає в комплексному підході до проєктування та
опису реалізації 2D піксельної RPG з комбінацією унікальних бойових механік
(позиційна шкода, розширені комбо, використання оточення), що детально описані та
підкріплені прикладами програмного коду та структурою ігрового проєкту.
Запропонована та реалізована система локалізації інтерфейсу користувача на українську
мову також є важливим практичним аспектом, що підвищує доступність гри для
вітчизняної аудиторії.
Практичне значення роботи полягає у створенні детальної документації проєкту
та функціонального прототипу ключових систем гри "Curse of Gothicvania", що може
слугувати міцною основою для подальшої повноцінної розробки та можливого випуску
комерційного ігрового продукту. Розроблені матеріали (опис архітектури, приклади
скриптів, підходи до організації проєкту) можуть бути використані як цінний
навчальний посібник для студентів, що вивчають розробку ігор на платформі Unity, а
також для незалежних розробників, які планують створювати ігри в схожому жанрі та
стилі. Проєкт демонструє, як за допомогою сучасних доступних інструментів та готових
ресурсів можна ефективно реалізувати амбітну ігрову концепцію.
81
Таким чином, у кваліфікаційній роботі успішно поєднано теоретичні дослідження
з практичною реалізацією, що дозволило глибоко вивчити процес створення сучасної 2D
рольової гри та закласти фундамент для розробки потенційно успішного ігрового
проєкту "Curse of Gothicvania".
82
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
(Повний список, включаючи джерела з Вступу, Розділу 1, Розділу 2, Розділу 3)
1. Upcoming Pixel Art Games 2025. YouTube. 2025. URL:
https://www.youtube.com/watch?v=gzowqVkGHZI (дата звернення: 28.05.2025).
2. The State of Pixel Art: Is It Still a Viable Style for Indie Games. Practical Media. 2024.
URL: https://practicalmedia.io/article/The-State-of-Pixel-Art-Is-It-Still-a-Viable-Style-
for-Indie-Games (дата звернення: 28.05.2025).
3. Unity Technologies. Unity 2D Game Development Best Practices. Unity
Documentation. 2024. URL: https://docs.unity3d.com/Manual/2D.html (дата
звернення: 28.05.2025).
4. Zvarych I., Kalaur S., Prymachenko N., Romashchenko I., Romanyshyna O.
Gamification as a Tool for Stimulating the Educational Activity of Students of Higher
Educational Institutions of Ukraine and the United States. European Journal of
Educational Research. 2019. Vol. 8, No. 3. P. 875-888.
5. Pixel Game Market Report 2024-2031. Cognitive Market Research. 2024. URL:
https://www.cognitivemarketresearch.com/pixel-game-market-report (дата звернення:
28.05.2025).
6. Schell J. The Art of Game Design: A Book of Lenses. 3rd Edition. CRC Press, 2020.
640 p.
7. Мельник І.В. Сучасні тенденції розвитку ігрової індустрії в Україні. Вісник
Черкаського державного технологічного університету. Серія: Технічні науки.
2023. № 2. С. 115-124.
8. Adams E. Fundamentals of Game Design. 3rd Edition. New Riders, 2023. 720 p.
83
9. OECD. Transforming General Upper Secondary Education in Ukraine. OECD
Publishing, 2025. URL:
https://www.oecd.org/content/dam/oecd/en/publications/reports/2025/01/transforming-
general-upper-secondary-education-in-ukraine_ff5d54d2/7c357ac4-en.pdf (дата
звернення: 28.05.2025).
10. Salen K., Zimmerman E. Rules of Play: Game Design Fundamentals. MIT Press, 2022.
688 p.
11. Verified Market Research. Role-Playing Games Market Size, Share & Trends Analysis
Report. 2024. URL: https://www.verifiedmarketresearch.com/product/role-playing-
games-market/ (дата звернення: 28.05.2025).
12. DataIntelo. Global Role-Playing Games Market Report 2024-2032. 2024. URL:
https://dataintelo.com/report/global-role-playing-games-market (дата звернення:
28.05.2025).
13. Business Research Insights. RPG Games Market Analysis and Forecast. 2024. URL:
https://www.businessresearchinsights.com/market-reports/rpg-games-market-120903
(дата звернення: 28.05.2025).
14. Statista. Role-Playing Games - Worldwide Market Outlook. 2024. URL:
https://www.statista.com/outlook/amo/app/games/role-playing-games/worldwide (дата
звернення: 28.05.2025).
15. Global Growth Insights. Tabletop Role-Playing Game (TTRPG) Market Report. 2024.
URL: https://www.globalgrowthinsights.com/market-reports/tabletop-role-playing-
game-ttrpg-market-103239 (дата звернення: 28.05.2025).
16. Upcoming Pixel Art Games 2025. YouTube. 2025. URL:
https://www.youtube.com/watch?v=gzowqVkGHZI (дата звернення: 28.05.2025).
84
17. 15 Upcoming Pixel Art Games of 2025. YouTube. 2025. URL:
https://www.youtube.com/watch?v=_RoZTLdGdg8 (дата звернення: 28.05.2025).
18. Top Upcoming Pixel RPGs 2020-2025. YouTube. 2024. URL:
https://www.youtube.com/watch?v=fBfPvanmGVU (дата звернення: 28.05.2025).
19. Rocketbrush Studio. Godot vs Unity: Comprehensive Comparison. 2024. URL:
https://rocketbrush.com/blog/godot-vs-unity (дата звернення: 28.05.2025).
20. Pixel Art Games Showcase 2025. YouTube. 2025. URL:
https://www.youtube.com/watch?v=QZcRbpS2epA (дата звернення: 28.05.2025).
21. Polydin Studio. Best 2D Game Engines Comparison. 2024. URL:
https://polydin.com/best-2d-game-engines/ (дата звернення: 28.05.2025).
22. Construct Community Forum. Why Construct is Better Than Other Engines. 2024. URL:
https://www.construct.net/en/forum/construct-3/general-discussion-7/construct-better-
engines-180928 (дата звернення: 28.05.2025).
23. The CTO Club. Best Game Development Software 2025. 2025. URL:
https://thectoclub.com/tools/best-game-development-software/ (дата звернення:
28.05.2025).
24. LogRocket Blog. Best JavaScript HTML5 Game Engines 2025. 2025. URL:
https://blog.logrocket.com/best-javascript-html5-game-engines-2025/ (дата звернення:
28.05.2025).
25. Meshy AI. Game Development Software Guide. 2025. URL:
https://www.meshy.ai/blog/game-development-software (дата звернення: 28.05.2025).
26. Unity Technologies. Unity 2D Development Best Practices. Unity Learn. 2024. URL:
https://learn.unity.com/tutorial/2d-best-practices (дата звернення: 28.05.2025).
85
27. Moldstud Analytics. Systems Analysis in the Gaming Industry: Powering Engaging User
Experiences. 2024. URL: https://moldstud.com/articles/p-systems-analysis-in-the-
gaming-industry-powering-engaging-user-experiences (дата звернення: 29.05.2025).
28. Nystrom R. Game Programming Patterns. Genever Benning, 2024. 354 p.
29. 15 Upcoming Pixel Art Games That Look Gorgeous. YouTube. 2024. URL:
https://www.youtube.com/watch?v=_RoZTLdGdg8 (дата звернення: 29.05.2025).
30. Sylvester T. Designing Games: A Guide to Engineering Experiences. 2nd Edition.
O’Reilly Media, 2023. 456 p.
31. Castle of Alchemists - Pixel Art Game Showcase. YouTube. 2024. URL:
https://www.youtube.com/watch?v=aiE8DBw5o24 (дата звернення: 29.05.2025).
32. Pixune Studios. UI/UX Design Pipeline in Game Development. 2025. URL:
https://pixune.com/blog/ui-ux-design-pipeline/ (дата звернення: 29.05.2025).
33. Full Scale. Game Development Guide: Documentation and Best Practices. 2024. URL:
https://fullscale.io/blog/game-development-guide/ (дата звернення: 29.05.2025).
34. Unity Technologies. Unity Architecture Best Practices. Unity Documentation. 2024.
URL: https://docs.unity3d.com/Manual/BestPractice.html (дата звернення:
29.05.2025).
35. Rogers S. Level Up! The Guide to Great Video Game Design. 3rd Edition. Wiley, 2023.
672 p.
36. EJAW. How to Get Started with Pixel Art Game Development. 2023. URL:
https://ejaw.net/how-to-get-started-with-pixel-art-game-development/ (дата звернення:
29.05.2025).
86
37. Microsoft. Visual Studio: IDE для розробників програмного забезпечення. URL:
https://visualstudio.microsoft.com/uk/ (дата звернення: 07.06.2025).
38. Epic Games. Unreal Engine. URL: https://www.unrealengine.com/ (дата звернення:
07.06.2025).
39. Gamma S., Helm R., Johnson R., Vlissides J. Design Patterns: Elements of Reusable
Object-Oriented Software. Addison-Wesley Professional, 1994. 416 p.
40. Unity Technologies. Unity User Manual: 2D Pathfinding. URL:
https://docs.unity3d.com/Manual/nav-2d-pathfinding.html (дата звернення:
07.06.2025).
41. Aseprite - Animated Sprite Editor & Pixel Art Tool. URL: https://www.aseprite.org/
(дата звернення: 07.06.2025).
42. Brackeys. MELEE COMBAT in Unity. YouTube. URL:
https://www.youtube.com/watch?v=sPiVz1k-fEs (дата звернення: 07.06.2025).
43. Tarvin D. Unity 2022 Game Development. Packt Publishing, 2022.
87
ДОДАТОК А
Затверджую
Зав. кафедри КНСА,
______________ Юрій ТРИУС
«___»____________2025 р.
РОЛЬОВА КОМП’ЮТЕРНА ГРА ЖАНРУ ФЕНТЕЗІ В ПІКСЕЛЬНОМУ 2D
СТИЛІНА ПЛАТФОРМІ UNITY
Специфікація
482.ЧДТУ. 52351-01 12 01
Листів 2
Розробник ____________________ Роман ДРАБАТИЙ
Керівник ____________________ Петро ДЯЧЕНКО
88
Черкаси – 2025
482.ЧДТУ. 52351-01
Позначення Найменування Примітка
Документація
482.ЧДТУ. 52351-01 12 01 Текст програми
482.ЧДТУ. 52351-01 34 01 Інструкція користувача
89
ДОДАТОК Б
РОЛЬОВА КОМП’ЮТЕРНА ГРА ЖАНРУ ФЕНТЕЗІ В ПІКСЕЛЬНОМУ 2D
СТИЛІНА ПЛАТФОРМІ UNITY
Текст програми
482.ЧДТУ. 52351-01 12 01
Листів 20
Розробник _____________ Роман ДРАБАТИЙ
90
Черкаси – 2025
Приклад коду DialogueSystem.cs
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.Events;
namespace CurseOfGothicvania.UI
{
/// <summary>
/// Handles dialogue display and interaction
/// </summary>
public class DialogueSystem : MonoBehaviour
{
[Header("UI References")]
[SerializeField] private GameObject dialoguePanel;
[SerializeField] private TextMeshProUGUI speakerNameText;
[SerializeField] private TextMeshProUGUI dialogueText;
[SerializeField] private Image speakerPortrait;
[SerializeField] private GameObject choicesContainer;
[SerializeField] private Button choiceButtonPrefab;
[SerializeField] private Button continueButton;
[SerializeField] private GameObject continueIndicator;
[Header("Dialogue Settings")]
[SerializeField] private float textSpeed = 0.05f;
[SerializeField] private bool autoAdvance = false;
[SerializeField] private float autoAdvanceDelay = 3f;
[SerializeField] private bool skipEnabled = true;
91
[SerializeField] private KeyCode skipKey = KeyCode.Space;
[Header("Effects")]
[SerializeField] private AudioClip typewriterSound;
[SerializeField] private float typewriterVolume = 0.5f;
[SerializeField] private AudioClip dialogueOpenSound;
[SerializeField] private AudioClip dialogueCloseSound;
[SerializeField] private AnimationCurve panelAnimationCurve =
AnimationCurve.EaseInOut(0, 0, 1, 1);
[SerializeField] private float panelAnimationDuration = 0.3f;
[Header("Portrait Settings")]
[SerializeField] private bool usePortraits = true;
[SerializeField] private Sprite defaultPortrait;
[SerializeField] private float portraitFadeSpeed = 2f;
// Dialogue data
private Queue<DialogueLine> currentDialogue;
private DialogueLine currentLine;
private bool isTyping = false;
private bool isDialogueActive = false;
private Coroutine typingCoroutine;
private List<Button> activeChoiceButtons = new List<Button>();
// Events
public UnityEvent onDialogueStart;
public UnityEvent onDialogueEnd;
public UnityEvent<string> onLineSpoken;
public UnityEvent<int> onChoiceMade;
// Properties
public bool IsDialogueActive => isDialogueActive;
public bool IsTyping => isTyping;
92
[System.Serializable]
public class DialogueLine
{
public string speakerName;
public string dialogueText;
public Sprite speakerPortrait;
public AudioClip voiceClip;
public bool hasChoices;
public List<DialogueChoice> choices;
public float customDelay = 0f;
public DialogueLine(string speaker, string text)
{
speakerName = speaker;
dialogueText = text;
choices = new List<DialogueChoice>();
}
}
[System.Serializable]
public class DialogueChoice
{
public string choiceText;
public UnityEvent onChoiceSelected;
public int nextDialogueIndex = -1;
public DialogueChoice(string text)
{
choiceText = text;
onChoiceSelected = new UnityEvent();
}
}
93
private void Awake()
{
// Set up UI references
if (continueButton != null)
{
continueButton.onClick.AddListener(OnContinueClicked);
}
// Initially hide dialogue
if (dialoguePanel != null)
{
dialoguePanel.SetActive(false);
}
currentDialogue = new Queue<DialogueLine>();
}
private void Update()
{
if (isDialogueActive && skipEnabled)
{
if (Input.GetKeyDown(skipKey))
{
if (isTyping)
{
SkipTyping();
}
else if (!currentLine.hasChoices)
{
DisplayNextLine();
}
}
94
}
}
/// <summary>
/// Starts a dialogue sequence
/// </summary>
public void StartDialogue(List<DialogueLine> dialogue)
{
if (dialogue == null || dialogue.Count == 0) return;
currentDialogue.Clear();
foreach (var line in dialogue)
{
currentDialogue.Enqueue(line);
}
StartDialogue();
}
/// <summary>
/// Starts dialogue from a ScriptableObject
/// </summary>
public void StartDialogue(DialogueData dialogueData)
{
if (dialogueData == null) return;
List<DialogueLine> lines = new List<DialogueLine>();
foreach (var data in dialogueData.dialogueLines)
{
DialogueLine line = new DialogueLine(data.speakerName,
data.dialogueText)
{
speakerPortrait = data.speakerPortrait,
95
voiceClip = data.voiceClip,
hasChoices = data.choices.Count > 0
};
foreach (var choiceData in data.choices)
{
line.choices.Add(new
DialogueChoice(choiceData.choiceText));
}
lines.Add(line);
}
StartDialogue(lines);
}
/// <summary>
/// Starts the dialogue
/// </summary>
private void StartDialogue()
{
isDialogueActive = true;
// Pause gameplay
Player.PlayerController player =
FindObjectOfType<Player.PlayerController>();
if (player != null)
{
player.SetCanMove(false);
}
// Show dialogue panel
StartCoroutine(ShowDialoguePanel());
96
// Play open sound
if (dialogueOpenSound != null)
{
Systems.AudioManager.Instance?.PlaySound(dialogueOpenSound);
}
// Trigger event
onDialogueStart?.Invoke();
// Display first line
DisplayNextLine();
}
/// <summary>
/// Displays the next line of dialogue
/// </summary>
private void DisplayNextLine()
{
if (currentDialogue.Count == 0)
{
EndDialogue();
return;
}
currentLine = currentDialogue.Dequeue();
// Update speaker name
if (speakerNameText != null)
{
speakerNameText.text = currentLine.speakerName;
}
97
// Update portrait
if (usePortraits && speakerPortrait != null)
{
UpdatePortrait(currentLine.speakerPortrait);
}
// Clear previous choices
ClearChoices();
// Start typing effect
if (typingCoroutine != null)
{
StopCoroutine(typingCoroutine);
}
typingCoroutine =
StartCoroutine(TypeLine(currentLine.dialogueText));
// Play voice clip if available
if (currentLine.voiceClip != null)
{
Systems.AudioManager.Instance?.PlaySound(currentLine.voiceClip);
}
// Trigger event
onLineSpoken?.Invoke(currentLine.speakerName);
}
/// <summary>
/// Types out the dialogue line character by character
/// </summary>
private IEnumerator TypeLine(string line)
98
{
isTyping = true;
dialogueText.text = "";
// Hide continue indicator
if (continueIndicator != null)
{
continueIndicator.SetActive(false);
}
foreach (char letter in line.ToCharArray())
{
dialogueText.text += letter;
// Play typewriter sound
if (typewriterSound != null && letter != ' ')
{
Systems.AudioManager.Instance?.PlaySound(typewriterSound,
typewriterVolume);
}
yield return new WaitForSeconds(textSpeed);
}
isTyping = false;
// Show choices or continue indicator
if (currentLine.hasChoices)
{
DisplayChoices();
}
else
99
{
if (continueIndicator != null)
{
continueIndicator.SetActive(true);
}
// Auto advance if enabled
if (autoAdvance && !currentLine.hasChoices)
{
float delay = currentLine.customDelay > 0 ?
currentLine.customDelay : autoAdvanceDelay;
yield return new WaitForSeconds(delay);
if (isDialogueActive && !isTyping)
{
DisplayNextLine();
}
}
}
}
/// <summary>
/// Skips the typing effect
/// </summary>
private void SkipTyping()
{
if (typingCoroutine != null)
{
StopCoroutine(typingCoroutine);
}
dialogueText.text = currentLine.dialogueText;
isTyping = false;
100
if (currentLine.hasChoices)
{
DisplayChoices();
}
else if (continueIndicator != null)
{
continueIndicator.SetActive(true);
}
}
/// <summary>
/// Displays dialogue choices
/// </summary>
private void DisplayChoices()
{
if (choicesContainer == null || choiceButtonPrefab == null)
return;
choicesContainer.SetActive(true);
for (int i = 0; i < currentLine.choices.Count; i++)
{
DialogueChoice choice = currentLine.choices[i];
Button choiceButton = Instantiate(choiceButtonPrefab,
choicesContainer.transform);
// Set button text
TextMeshProUGUI buttonText =
choiceButton.GetComponentInChildren<TextMeshProUGUI>();
if (buttonText != null)
{
buttonText.text = choice.choiceText;
101
}
// Add click listener
int choiceIndex = i;
choiceButton.onClick.AddListener(() =>
OnChoiceSelected(choiceIndex));
activeChoiceButtons.Add(choiceButton);
}
}
/// <summary>
/// Handles choice selection
/// </summary>
private void OnChoiceSelected(int choiceIndex)
{
if (choiceIndex < 0 || choiceIndex >=
currentLine.choices.Count) return;
DialogueChoice selectedChoice =
currentLine.choices[choiceIndex];
// Clear choices
ClearChoices();
// Trigger choice event
selectedChoice.onChoiceSelected?.Invoke();
onChoiceMade?.Invoke(choiceIndex);
// Continue dialogue or end
if (selectedChoice.nextDialogueIndex >= 0)
{
// Jump to specific dialogue index
102
// This would require modifying the dialogue queue
DisplayNextLine();
}
else
{
DisplayNextLine();
}
}
/// <summary>
/// Clears all choice buttons
/// </summary>
private void ClearChoices()
{
foreach (Button button in activeChoiceButtons)
{
Destroy(button.gameObject);
}
activeChoiceButtons.Clear();
if (choicesContainer != null)
{
choicesContainer.SetActive(false);
}
}
/// <summary>
/// Updates the speaker portrait
/// </summary>
private void UpdatePortrait(Sprite portrait)
{
if (speakerPortrait == null) return;
103
Sprite targetPortrait = portrait ?? defaultPortrait;
if (targetPortrait != null)
{
speakerPortrait.sprite = targetPortrait;
speakerPortrait.enabled = true;
// Fade in portrait
StartCoroutine(FadePortrait(0f, 1f));
}
else
{
speakerPortrait.enabled = false;
}
}
/// <summary>
/// Fades the portrait
/// </summary>
private IEnumerator FadePortrait(float from, float to)
{
float timer = 0f;
Color color = speakerPortrait.color;
while (timer < 1f / portraitFadeSpeed)
{
timer += Time.deltaTime;
color.a = Mathf.Lerp(from, to, timer *
portraitFadeSpeed);
speakerPortrait.color = color;
yield return null;
}
104
color.a = to;
speakerPortrait.color = color;
}
/// <summary>
/// Called when continue button is clicked
/// </summary>
private void OnContinueClicked()
{
if (!isTyping && !currentLine.hasChoices)
{
DisplayNextLine();
}
}
/// <summary>
/// Ends the dialogue
/// </summary>
private void EndDialogue()
{
isDialogueActive = false;
// Hide dialogue panel
StartCoroutine(HideDialoguePanel());
// Resume gameplay
Player.PlayerController player =
FindObjectOfType<Player.PlayerController>();
if (player != null)
{
player.SetCanMove(true);
}
105
// Play close sound
if (dialogueCloseSound != null)
{
Systems.AudioManager.Instance?.PlaySound(dialogueCloseSound);
}
// Trigger event
onDialogueEnd?.Invoke();
}
/// <summary>
/// Shows the dialogue panel with animation
/// </summary>
private IEnumerator ShowDialoguePanel()
{
if (dialoguePanel == null) yield break;
dialoguePanel.SetActive(true);
CanvasGroup canvasGroup =
dialoguePanel.GetComponent<CanvasGroup>();
if (canvasGroup != null)
{
float timer = 0f;
while (timer < panelAnimationDuration)
{
timer += Time.deltaTime;
float t = panelAnimationCurve.Evaluate(timer /
panelAnimationDuration);
canvasGroup.alpha = t;
106
// Scale animation
dialoguePanel.transform.localScale =
Vector3.Lerp(Vector3.one * 0.8f, Vector3.one, t);
yield return null;
}
canvasGroup.alpha = 1f;
dialoguePanel.transform.localScale = Vector3.one;
}
}
/// <summary>
/// Hides the dialogue panel with animation
/// </summary>
private IEnumerator HideDialoguePanel()
{
if (dialoguePanel == null) yield break;
CanvasGroup canvasGroup =
dialoguePanel.GetComponent<CanvasGroup>();
if (canvasGroup != null)
{
float timer = 0f;
while (timer < panelAnimationDuration)
{
timer += Time.deltaTime;
float t = 1f - panelAnimationCurve.Evaluate(timer /
panelAnimationDuration);
canvasGroup.alpha = t;
107
// Scale animation
dialoguePanel.transform.localScale =
Vector3.Lerp(Vector3.one, Vector3.one * 0.8f, 1f - t);
yield return null;
}
canvasGroup.alpha = 0f;
}
dialoguePanel.SetActive(false);
}
/// <summary>
/// Adds a single line to the current dialogue
/// </summary>
public void AddLine(string speaker, string text)
{
currentDialogue.Enqueue(new DialogueLine(speaker, text));
}
/// <summary>
/// Clears the current dialogue queue
/// </summary>
public void ClearDialogue()
{
currentDialogue.Clear();
if (isDialogueActive)
{
EndDialogue();
}
}
}
108
/// <summary>
/// ScriptableObject for dialogue data
/// </summary>
[CreateAssetMenu(fileName = "New Dialogue", menuName =
"Gothicvania/Dialogue Data")]
public class DialogueData : ScriptableObject
{
[System.Serializable]
public class DialogueLineData
{
public string speakerName;
[TextArea(3, 5)]
public string dialogueText;
public Sprite speakerPortrait;
public AudioClip voiceClip;
public List<DialogueChoiceData> choices = new
List<DialogueChoiceData>();
}
[System.Serializable]
public class DialogueChoiceData
{
public string choiceText;
public DialogueData nextDialogue;
}
public List<DialogueLineData> dialogueLines = new
List<DialogueLineData>();
}
}
109
ДОДАТОК В
РОЛЬОВА КОМП’ЮТЕРНА ГРА ЖАНРУ ФЕНТЕЗІ В ПІКСЕЛЬНОМУ 2D
СТИЛІ НА ПЛАТФОРМІ UNITY
ІНСТРУКЦІЯ КОРИСТУВАЧА
482. ЧДТУ. 52350-01 34 01
Листів 4
Розробник _____________ Роман ДРАБАТИЙ
Черкаси – 2025
110
Таблиця В.1 – Керування ігровим персонажем
Рух Атака Стрибок Блок Перекат Взаємодія
стрілки/WA Z/J X/K C/L Shift Space
SD