Курс викладається російською мовою: відео та матеріали російськомовні. Українська версія курсу з’явиться пізніше.
Що ви зможете після курсу
- Програмувати на C#: змінні, типи даних, умови, цикли, масиви та методи — і застосовувати їх в ігрових механіках
- Налаштовувати анімацію персонажа через Animator і Animator Controller: ходьбу, стрибок і переходи між станами
- Збирати бойову систему: здоров’я та урон, ближню атаку противника і дальній бій стрілами з пулом об’єктів
- Застосовувати основи ООП — класи, успадкування, поліморфізм, інтерфейси — у коді ігрових об’єктів
- Збирати інтерфейс гри: шкалу здоров’я, меню та збереження даних гравця через PlayerPrefs
- Вести проєкт у Git, збирати тестовий APK під Android і готувати картку застосунку в Google Play
Кому підійде курс
Початківцям без досвіду програмування
Навчання починається зі встановлення Unity та пояснення базових понять рушія і мови C# з нуля — попередні знання програмування чи розробки ігор не потрібні.
Тим, хто хоче розібратися в C# на практиці
Змінні, цикли, масиви, класи та ООП розбираються не окремим теоретичним блоком, а одразу на ігрових механіках — здоров’я, урон, стрільба, інвентар.
Тим, хто розглядає геймдев як професію
У курсі розбираються портфоліо, резюме та вакансії програміста й геймдизайнера — для тих, хто планує працевлаштування в галузі, а не лише хобі.
Курс не підійде тим, хто шукає 3D-розробку, мережеву гру з мультиплеєром або доведену до магазину публікацію комерційного проєкту — у курсі цього немає.
Як проходить навчання
- Уроки відкриваються поступово в міру проходження, а не всі одразу — Матеріал засвоюється покроково, без спокуси розпорошитися на весь курс одразу
- Під кожним відео — картка для завантаження домашнього завдання і статус його перевірки куратором — Є кому розібрати помилки у власному коді, а не лише подивитися відео
- Питання куратору ставляться в чаті курсу, який приймає скриншоти та файли — Питання щодо свого коду можна поставити одразу, не відкладаючи на потім
- Відеоплеєр підтримує регулювання швидкості та режим вікна поверх інших програм — Зручно тримати урок відкритим прямо під час роботи в Unity
- Виконані та прийняті домашні завдання видно іншим учням потоку — Можна подивитися чужі рішення тієї самої задачі та звірити свій підхід
Що знадобиться для навчання
- Unity Editor і Unity Hub
- Середовище розробки JetBrains Rider або Visual Studio для написання коду на C#
- Акаунт на GitLab і клієнт SourceTree для роботи із системою контролю версій Git
Чому самостійно розібратися складно
Окремі уроки та статті з Unity зазвичай показують один прийом — стрибок, анімацію або систему урону — поза контекстом цілісного проєкту. Зібрати з таких прикладів бойову систему, інвентар та інтерфейс, які працюють разом в одному коді, складніше, ніж здається за окремими прикладами.
Помилки на кшталт хибних переходів анімації, відсутності реакції на урон або зайвих викликів GetComponent та Instantiate, які сповільнюють гру, проявляються лише на реальному обсязі коду — і без розбору залишаються в проєкті.
Довести проєкт до публікації — зібрати APK, налаштувати картку застосунку в Google Play, підключити монетизацію через Unity Ads і Unity IAP — окрема тема, яку самостійні туторіали майже не торкаються.
Що зміниться
До курсу
- Немає досвіду програмування та розробки ігор
- Незрозуміло, як влаштована анімація персонажа в Unity
- Немає уявлення, як зібрати бойову систему гри
- Код розростається і починає гальмувати
- Проєкт існує тільки на одному комп’ютері
Після курсу
- Пишете на C# і орієнтуєтесь в інтерфейсі Unity
- Налаштовуєте Animator Controller і переходи між анімаціями ходьби та стрибка
- Реалізуєте здоров’я, урон, ближню атаку і стрільбу з пулом об’єктів
- Оптимізуєте код через пул об’єктів і словник GameManager замість GetComponent та Instantiate
- Ведете проєкт у Git і отримуєте тестову збірку під Android
Як влаштований шлях
- Основи Unity та C# Будова рушія, інтерфейс редактора та базовий синтаксис мови на прикладі керування персонажем
- Ігрові механіки Бойова система, анімація, ООП і стрільба вбудовуються в код одного проєкту, що росте
- Інтерфейс і дані Шкала здоров’я, меню, система інвентарю та збереження даних гравця
- Публікація Контроль версій у Git, збірка під Android і підготовка картки застосунку в Google Play
Програма курсу
125 уроків · 11 модулів · 15 годин 54 хвилини відео · від першого об’єкта на сцені до збірки гри під Android
-
Розділ знайомить з інтерфейсом Unity: створення 2D-проєкту, робота з об’єктами та компонентами, перший скрипт керування персонажем і збірка ігрового рівня з префабів.
- Структура проєкту15:18
Створюється новий 2D-проєкт через Unity Hub, і розбираються основні вікна редактора — Project, Hierarchy, Scene та Inspector, а також поняття GameObject і компонента. Окремо розглядається обов’язковий для всіх об’єктів компонент Transform, що відповідає за положення, поворот і масштаб.
- Компоненти21:56
На прикладі гравця та платформи розбираються чотири базові компоненти Unity: Transform, Sprite Renderer, Rigidbody 2D і Collider. Показано, як об’єкт отримує зображення через спрайт, фізичне тіло з гравітацією та зіткнення через колайдер.
- Керування гравцем11:56
Створюється перший C#-скрипт і пояснюються методи Start та Update, після чого пишеться код для переміщення персонажа вліво-вправо за натисканням клавіш через Transform. Швидкість руху коригується через Time.deltaTime, а зайвий поворот об’єкта усувається налаштуванням Freeze Rotation по осі Z у Rigidbody2D.
- Змінні та робота з фізикою14:17
Пояснюється призначення змінних і типу float на прикладі швидкості персонажа, а різниця між GetKeyDown і GetKey показана на прикладі одноразового натискання клавіші. Додається стрибок через застосування сили до Rigidbody2D методом AddForce з імпульсом ForceMode2D.Impulse.
- Префаби та сцени8:46
З об’єктів гравця та платформи створюються префаби, з яких збирається нова сцена рівня, а камера робиться дочірнім об’єктом гравця, щоб слідувати за ним. Додатково дається домашнє завдання зібрати свій рівень і показано безкоштовний інструмент планування завдань Trello.
- Вчимося надсилати ДЗ5:35
Розбирається формат здачі домашніх завдань через Unity Package: збереження проєкту, експорт з урахуванням залежностей асетів, виключення зайвих сцен і єдиний шаблон іменування файлу. Готовий пакет завантажується в хмарне сховище, а посилання на нього надсилається куратору.
- Структура проєкту15:18
-
Розділ розбирає синтаксис C# від типів даних і змінних до масивів та методів — на консольних прикладах і в застосуванні до ігрових об’єктів Unity.
-
Розділ розбирає типи даних C#, оголошення та приведення змінних, а також математичні операції та закріплює матеріал розрахунком площі фігур.
- Примітивні типи даних у C#9:03
Урок систематизує примітивні та складені типи даних C#, їхній обсяг у байтах і принцип двійкового представлення. Розбираються числові типи різного розміру — byte, short, int, long — а також float, char, string і базовий тип object, і критерії вибору типу під конкретну задачу.
- Оголошення змінних5:48
На практичних прикладах розбирається синтаксис оголошення та ініціалізації змінних у C#: вказання типу, ім’я у стилі camelCase і різниця між оголошенням та ініціалізацією через знак рівності. Показано різницю між змінною, оголошеною в скрипті, і змінною всередині методу, та її вплив на область видимості.
- Приведення типів6:00
Урок розбирає явне приведення типів через вказання типу в дужках, включно з переведенням float у int з відкиданням дробової частини, і переведенням числа в рядок методом toString. Окремо розглядаються випадки неявного приведення між числовими типами, наприклад short і byte в int.
- Математичні операції6:54
Урок показує арифметичні операції C#: додавання, віднімання, множення, цілочисельне ділення з остачею через оператор відсотка, а також пріоритет їх виконання. Розглядаються методи класу MathF для чисел з плаваючою комою, включно з піднесенням до степеня MathF.Pow.
- ДЗ з операцій1:05
Домашнє завдання — написати програму, яка обчислює площу квадрата, прямокутника і кола за заданими сторонами та радіусом, з використанням змінних, математичних операцій і константи Mathf.PI. Результат — три числа з площами фігур, виведені в консоль Unity.
- Примітивні типи даних у C#9:03
-
Розділ розбирає умовні оператори if і switch, цикли while та for і їх практичне застосування — від повернення персонажа при падінні до таблиці множення та накопичувальних розрахунків.
- Умовні оператори9:48
Урок розбирає умовні оператори if, else та else if, знаки порівняння і логічні оператори && та ||, а також заперечення !, що визначають розгалуження виконання програми. Показано, як умова if перевіряє логічний вираз і виконує своє тіло лише за істинного результату.
- Застосування if: падіння за межі карти9:55
Показано, як умова if за координатою transform.position.y повертає персонажа у вихідну точку при падінні нижче заданої висоти, заданої змінною minimalHeight. Додатково пояснюється скидання швидкості через Vector2, щоб Rigidbody 2D не зберігав набрану при падінні швидкість після телепортації.
- Bool-змінна IsCheatMode4:36
Показано, як логічна змінна isCheatMod, винесена в інспектор Unity, керує поведінкою персонажа при падінні: увімкнений режим телепортує його в початкову точку, вимкнений — видаляє об’єкт зі сцени методом Destroy. Умова об’єднує перевірку падіння з перевіркою isCheatMod через оператор &&, а гілка elseIf перевіряє інверсію значення через знак оклику.
- Switch case4:24
Розглядається конструкція switch-case як альтернатива ланцюжку if-else-if на прикладі змінних із кількістю фруктів: кожен case описує конкретне значення і завершується ключовим словом break. Зазначається, що switch виконує те саме завдання, що й if-else-if, але працює повільніше для процесора.
- Лямбда-оператори4:49
Урок пояснює скорочений запис операцій присвоєння на кшталт «+=» і унарні оператори інкременту та декременту «++» і «–» у постфіксній та префіксній формі. Показано різницю між формами: при постфіксній спочатку виводиться старе значення змінної, при префіксній — уже змінене.
- ДЗ з if2:23
Домашнє завдання — написати програму, яка за значеннями трьох змінних із кількістю фруктів визначає і виводить їхні назви в порядку спадання кількості за допомогою вкладених умовних операторів if. Підказка пропонує розміщувати всередині однієї умови додаткові перевірки для порівняння значень.
- Цикл while5:37
Урок пояснює синтаксис і роботу циклу while: конструкція повторює тіло циклу, поки вказана умова залишається істинною, на відміну від одноразового виконання оператора if. На прикладі змінної з кількістю яблук показано, як цикл зі зменшенням значення всередині тіла виводить повідомлення кілька разів, а також розбирається небезпека зависання програми при неправильно складеній умові виходу.
- Цикл for4:22
Урок пояснює будову циклу for у C#: три частини його заголовка в дужках — оголошення змінної-лічильника, умова продовження і правило зміни лічильника — і порядок їх виконання на кожному кроці. Змінна-лічильник зазвичай оголошується типом int з початковим значенням 0 і змінюється інкрементом або декрементом.
- Застосування циклу (таблиця множення)4:52
Урок показує практичне застосування циклу for на задачі виведення в консоль таблиці множення для заданого числа і розбирає типову помилку, коли умова циклу не доходить до останнього множника. Заразом виправляється помилка сцени Unity з камерою, що відкріпилася від гравця.
- Застосування циклу (задача з лижником)5:17
Урок вирішує задачу про наростаючий пробіг лижника циклом while, пояснюючи, що вибір циклу while замість for виправданий, коли кількість повторень заздалегідь невідома. У тілі циклу на кожному кроці перераховується дистанція з відсотковим приростом і виводиться повідомлення через конкатенацію рядків.
- Умовні оператори9:48
-
Розділ вводить масиви та методи C#, показує їх застосування на ігрових об’єктах і завершується правилом читабельного іменування змінних у коді.
- Масиви та робота з індексами12:07
Урок вводить масиви як набір однотипних змінних під одним іменем: оголошення, ініціалізація ключовим словом new і звернення до елемента за індексом, починаючи з нуля. Показано заповнення масиву чисел циклом for і зберігання в масиві компонентів Unity, наприклад Sprite Renderer, який заповнюється в інспекторі перетягуванням об’єктів.
- ДЗ з масивів2:11
Домашнє завдання — обчислити, скільки разів потрібно скласти навпіл аркуш паперу, щоб його товщина перевищила відстань до Місяця, з урахуванням переповнення типу int, і перефарбувати всі платформи рівня в різні кольори способом із масивом Sprite Renderer. Завдання спирається на принцип подвоєння товщини аркуша при кожному складанні.
- Структура та виклик методів14:24
Урок пояснює структуру методу в C#: сигнатуру з модифікатором доступу, типом значення, що повертається, та іменем, аргументи в дужках і оператор return, на прикладі методу обчислення площі прямокутника. Показано, що метод із зазначеним типом значення, яке повертається, зобов’язаний його повернути, а після return подальші рядки методу не виконуються.
- ДЗ з методів1:01
Домашнє завдання — написати три методи: порівняння двох чисел із поверненням bool, виведення повідомлення без аргументів і без значення, що повертається, та обчислення площі кола за радіусом. Перший метод використовує кілька операторів return у різних гілках умови для повернення різних логічних значень.
- Іменування змінних0:56
Урок формулює правило іменування змінних: лише англійська мова, без транслітерації і без беззв’язних наборів символів, щоб код був зрозумілий іншим програмістам, включно з колегами з інших країн. Дотримання стандартів іменування розглядається як норма професійної етики розробника, значущість якої зростає в міру збільшення кількості скриптів у проєкті.
- Масиви та робота з індексами12:07
-
-
Розділ збирає противника з патрулюванням заданою територією, багаторазовий компонент здоров’я для гравця та ворога, обробку зіткнень і урону за тегами, а також збір монет і предметів.
- Створення ворога13:00
Спрайт ворога оформлюється в перевикористовуваний префаб, до нього додаються компоненти Rigidbody 2D і Circle Collider 2D, а у гравця квадратний колайдер замінюється на Polygon Collider 2D за формою спрайта. Область патрулювання ворога задається трьома порожніми об’єктами — зоною і двома межами.
- Рух ворога8:33
Пишеться скрипт патрулювання ворога: посилання на ліву й праву межі задаються публічними змінними GameObject, а напрямок руху зберігається в булевій змінній. Швидкість передається через Rigidbody 2D, а умова if/else залежно від напрямку присвоює об’єкту вектор швидкості праворуч або ліворуч.
- Ареал проживання ворога3:49
До скрипту патрулювання додається порівняння координати x ворога з координатами меж Left Border і Right Border. При досягненні правої межі значення змінної напрямку змінюється на false, при досягненні лівої — на true, а сам розворот реалізований інверсією булевої змінної.
- Здоров’я персонажа10:35
Створюється перевикористовуваний компонент Health зі змінною здоров’я, який додається і гравцю, і ворогу. Метод TakeHit віднімає отриману шкоду і знищує об’єкт при падінні здоров’я до нуля, а метод SetHealth додає бонусне здоров’я.
- Налаштування здоров’я4:00
Здоров’я обмежується сотнею очок, гравцю задається 100 очок, а ворогу — 50, зміни переносяться в префаби. Під час тестування виявляється, що пряме записування в змінну velocity компонента Rigidbody вимикає у ворога дію гравітації.
- Отримання шкоди6:19
Створюється компонент CollisionDamage зі змінною шкоди й обробником OnCollisionEnter2D, окремо налаштованим для гравця і для ворога. Debug.Log виявляє, що метод спрацьовує і при зіткненні з платформою, а не тільки з цільовим об’єктом.
- Обробка зіткнень12:23
Вводиться змінна collisionTag і метод compareTag, щоб обмежити обробку зіткнень об’єктами з потрібним тегом (Player у гравця, Enemy у ворога). Доступ до компонента Health іншого об’єкта отримують методом GetComponent, після чого викликають його публічний метод TakeHit з величиною шкоди.
- Виправлення помилок7:16
Створюється окремий компонент GroundDetection з публічною змінною isGrounded, яка через методи onCollisionEnter2D і onCollisionExit2D та тег Platform відстежує контакт об’єкта з платформою. Скрипт додається і гравцю, і ворогу, але поки що ніяк не впливає на їхню поведінку.
- Обробка дотику до землі6:25
Змінна isGrounded компонента GroundDetection пов’язується з поведінкою гравця і ворога: стрибок і рух дозволені тільки при контакті з платформою, а посилання на компонент передається через інспектор drag and drop. Розібрано й альтернативний спосіб отримати посилання — виклик GetComponent у методі Start.
- Збір монеток10:07
Створюється монета, яку можна зібрати: круглий спрайт з Circle Collider 2D і Rigidbody 2D у статичному режимі, колайдер перемкнений у режим тригера. Для гравця заводиться скрипт інвентарю з полем кількості монет, яке збільшується через onTriggerEnter2D при спрацюванні тригера з тегом монети.
- Створення ворога13:00
-
Розділ розбирає роботу з аніматором Unity: імпорт спрайтів, машину станів, параметри та переходи між анімаціями ходьби і стрибка персонажа.
-
Розділ показує імпорт спрайтів персонажа, створення Animator Controller і збірку анімації ходьби, а також перехід керування персонажем на фізичну основу через Rigidbody.
- Розбір домашнього завдання5:01
Урок розбирає розв’язання домашнього завдання: знищення підібраного об’єкта через колайдер-тригер та аптечку, яка через GetComponent звертається до скрипту здоров’я і нараховує бонусні очки без обмеження за максимумом.
- Імпорт спрайтів8:10
Урок присвячений імпорту спрайтів ходьби персонажа та налаштуванню параметрів текстури: режиму Sprite 2D and UI, типу сітки Mesh Type, точки прив’язки Pivot і стискання зображень через Max Size з компенсацією через Pixels Per Unit.
- Створення аніматора5:05
Спрайт персонажа замінюється на зображення з ходьби, колайдер-трикутник змінюється на єдиний Box Collider за силуетом, а потім створюється аніматор-контролер із порожньою анімацією Walking і таймлайном для запису кадрів.
- Створення анімації ходьби6:00
Спрайти ходьби збираються в анімацію, швидкість зміни кадрів знижується розтягуванням ключових кадрів на часовій шкалі, а експеримент із властивістю Position показує інтерполяцію числових значень через криві Curves перед тим, як цю властивість видаляють як зайву.
- Оптимізація керування8:04
Урок вводить поняття скінченного автомата аніматора — стани Entry, Any State і Exit, параметри переходів Float, Int, Bool і Trigger — і наводить лад у скрипті персонажа: перевірку падіння виносять в окремий метод, а переміщення переводять на FixedUpdate для стабільної фізики.
- Оптимізація керування 28:24
Керування персонажем переписують через напрямок і rigidbody.velocity так, щоб рух зупинявся без інерції, а вертикальна складова бралась із поточної швидкості фізичного тіла; додатково посилюють гравітацію і налаштовують силу стрибка.
- Розбір домашнього завдання5:01
-
Розділ пов’язує код персонажа з параметрами аніматора, налаштовує переходи між спокоєм, ходьбою і стрибком та збирає тричастинну анімацію стрибка — від відштовхування до приземлення.
- Параметри в анімації5:24
Створюється кліп анімації спокою, який призначається станом за замовчуванням в аніматорі, а між станами спокою і ходьби налаштовуються двосторонні переходи за числовим параметром швидкості з порогом трохи більше нуля.
- Програмування параметрів анімації4:16
У скрипті персонажа створюється посилання на компонент аніматора, а значення швидкості передається в нього методом встановлення числового параметра; проблему від’ємних значень під час руху вліво вирішують застосуванням модуля числа до напрямку.
- Віддзеркалення анімації по горизонталі4:49
Прибирається затримка перед стартом анімації ходьби через вимкнення exit time і обнулення transition duration, а розворот персонажа під час руху вліво реалізується через параметр Flip X компонента Sprite Renderer, яким керують зі скрипту за знаком напрямку руху.
- Три кліпи анімації стрибка5:24
Усувається розсинхронізація між введенням і фізичним циклом зменшенням параметра Fixed Timestep, а стрибок розбивається на три стани — відштовхування, політ і приземлення, — під кожен з яких створюється окремий кліп анімації.
- Переходи аніматора між станами стрибка7:23
Збираються переходи аніматор-контролера для стрибка: вхід із будь-якого стану за тригером, автоматичний перехід у фазу польоту, приземлення за булевою змінною контакту із землею і окремий перехід у падіння без відштовхування.
- Виправлення переходу між стрибком і падінням7:25
Вводиться змінна isJumping, яка разом із перевіркою дотику до землі усуває передчасне перемикання анімації старту стрибка на анімацію падіння на ранньому кадрі стрибка.
- Виправлення подвійних зіткнень5:30
Розбирається проблема зависання анімації під час одночасного дотику персонажа до двох платформ, і вирішується створенням окремого дочірнього колайдера ніг меншого розміру для визначення контакту із землею — прийом композиції колайдерів замість одного точного Polygon Collider 2D.
- Доповнення про аніматор2:16
Урок пояснює прийом захисту коду від відсутніх посилань на компоненти: перед зверненням до посилання, наприклад на аніматор, додається перевірка на null, що запобігає помилці виконання за неповного набору компонентів на об’єкті.
- Параметри в анімації5:24
-
-
Розділ розбирає класи та структури, конструктори, властивості, статичні члени, патерн Singleton, успадкування, поліморфізм, абстрактні класи, інтерфейси та інкапсуляцію — на прикладах, застосовних до коду гри.
- Класи та структури10:44
Урок вводить поняття класу як шаблону об’єкта з полями та методами і показує створення екземпляра через оператор new і конструктор. Пояснюється різниця між посилальним типом класу та структурою, яка зберігає значення напряму і не може дорівнювати null. Завдання — описати клас Cat з полями імені, віку, ваги, зросту та довжини хвоста і методом виведення інформації, а потім перетворити його на структуру.
- Простір імен5:56
Урок розбирає звернення до вкладених класів і пояснює призначення простору імен та директиви using для розрізнення класів з однаковими назвами, наприклад під час використання сторонніх бібліотек. Показано приклад конфлікту між класом Random з Unity та з бібліотеки System.
- Конструктори8:50
Урок пояснює конструктор класу як метод, що задає стартові значення полів об’єкта під час створення, — конструктор за замовчуванням і конструктор з параметрами. Розбирається використання ключового слова this при збігу імен параметрів і полів, а також відмінність конструкторів класу від конструкторів структури.
- Властивості7:34
Урок вводить властивості як заміну методів get і set для доступу до приватних полів, включно з перевірками значень у блоці set та окремими модифікаторами доступу для читання і запису. Показано автоматичні властивості та скорочений запис властивості лише для читання.
- Статичні класи та методи7:49
Урок пояснює різницю між статичними методами, які викликаються за іменем класу без створення екземпляра, і звичайними методами, що потребують екземпляра об’єкта. Розбираються обмеження статичного класу: в ньому не можна оголошувати нестатичні поля та методи і створювати його екземпляр.
- Патерн Singleton4:30
Урок розбирає патерн Singleton — статичну властивість instance, що зберігає єдиний екземпляр класу на сцені, та ініціалізацію цієї властивості в методі start. Показано, що непередбачуваний порядок виклику start у різних скриптів може призвести до звернення до ще не ініціалізованого instance і помилки nullReferenceException.
- Awake і продовження Singleton4:48
Урок показує, що метод awake викликається раніше за start, тому ініціалізація Singleton в awake виключає звернення до ще порожнього посилання instance. Розбирається порядок виклику методів Unity (awake, start, update, lateUpdate) і прийом групування коду директивами #region. Завдання — переробити скрипт PlayerInventory під патерн Singleton, прибравши метод OnTriggerEnter2D і перенісши нарахування монет у скрипт Player через звернення до instance.
- Успадкування8:28
Урок пояснює успадкування на прикладі класів Animal і Dog: клас-нащадок отримує публічні поля та методи батька, але не має доступу до його приватних методів. Зазначається, що всі класи неявно успадковуються від базового класу SystemObject, звідки беруться методи Equals, GetHashCode, GetType і ToString.
- Батьківські класи Unity5:45
Урок показує ланцюжок успадкування власних скриптів від MonoBehaviour через Behaviour і Component до UnityEngine.Object і пояснює походження звичних методів і властивостей компонентів. Розбираються властивості та методи кожного рівня ланцюжка — від Enabled і GetComponent до Destroy та Instantiate.
- Поліморфізм6:13
Урок пояснює поліморфізм на прикладі методів virtual і override: клас-нащадок задає власну реалізацію методу батька, а без перевизначення викликається реалізація через base. Показано, що екземпляр класу-нащадка можна зберігати в змінній батьківського типу, зберігаючи доступ до перевизначеного методу.
- Абстрактні класи та інтерфейси10:37
Урок розбирає абстрактний клас, екземпляри якого створити не можна, з абстрактними методами, обов’язковими для реалізації в нащадках, а також інтерфейс як опис сигнатур методів без реалізації. Зазначається, що клас може успадковувати кілька інтерфейсів, але лише один базовий клас. Завдання — створити абстрактний клас Vehicle з полем імені та абстрактним методом звуку і три класи-нащадки.
- Інкапсуляція6:05
Урок пояснює інкапсуляцію як приховування полів класу від прямої зміни ззовні: приватні та protected-модифікатори обмежують доступ, а властивості з перевірками в блоці set контролюють значення, що присвоюються. Показано атрибут SerializeField, який відображає приватне поле в інспекторі Unity, не відкриваючи доступ до нього з коду.
- Класи та структури10:44
-
Розділ збирає анімацію противника, систему стрільби стрілами з імпульсом і фізичним польотом, роботу з корутинами для обмеження часу життя об’єкта та перехід логіки урону на принцип композиції.
- Розбір ДЗ – анімація вовка6:01
Розбирається домашнє завдання з анімації ходьби вовка: створюється окремий Animator Controller зі станом Walking, замість полігонального колайдера налаштовується Box Collider, а для розвороту спрайту за напрямком руху повторно використовується логіка FlipX зі скрипту гравця, яка визначає напрямок за знаком швидкості Rigidbody.
- Розбір ДЗ – анімація укусу8:20
Розбирається анімація укусу вовка: вводиться загальний тригер шкоди в аніматорі, а сам виклик шкоди переноситься з перевірки зіткнення в окремий публічний метод, який запускається анімаційною подією в момент укусу. Посилання на компонент Health кешується і перевіряється на null, що захищає від повторної шкоди й помилок при зіткненні з об’єктами без цього компонента.
- Розбір ДЗ — анімація укусу 29:33
Розбирається виклик шкоди з анімації укусу через кадр-подію та розрахунок напрямку атаки за різницею координати X між противником і персонажем. Умова переходу в анімацію укусу переводиться на модуль цієї змінної, а повторне завдання шкоди при постійному контакті вирішується заміною обробки першого дотику на перевірку зіткнення кожного кадру.
- Розбір ДЗ — анімація укусу 38:40
Виправляється помилка, за якої противник кусає гравця у попередньому напрямку руху, навіть якщо той підійшов ззаду: змінна напрямку в скрипті шкоди стає публічною властивістю лише для читання, а скрипт патрулювання переписується з урахуванням сторони, з якої перебуває противник. У результаті противник повертається обличчям до гравця незалежно від напрямку підходу.
- Створення стрільби9:30
Збирається префаб стріли з компонентами твердого тіла та колайдера, а її політ реалізується через фізичний імпульс — як і стрибок персонажа, — тож подальшу параболічну траєкторію задає гравітація. Створення стріли за натисканням кнопки миші переноситься в окремий метод та інший цикл оновлення, що усуває появу кількох стріл за один постріл.
- Стрільба8:44
Налаштовується точка появи стріли через дочірній Transform на персонажі, а створеному об’єкту стріли задається імпульс методом SetImpulse з напрямком і силою, пропорційною силі стрибка. Проблема проходження швидких стріл крізь противника вирішується перемиканням Collision Detection на Continuous, а для стріли створюються анімації Flying і Damage з переходом за параметром Direction.
- Корутини4:11
Вводиться поняття корутини — методу, виконання якого може розтягуватися в часі, на відміну від звичайних методів Unity, що відпрацьовують за один кадр. На прикладі виведення великої кількості повідомлень у консоль за натисканням клавіші показується, що виконання об’ємної операції цілком за один кадр спричиняє підвисання гри, а рішенням називається розподіл дій у часі за допомогою корутин.
- Час життя стріли9:37
Розбирається механізм корутин через інтерфейс IEnumerator і конструкцію Yield Return з різними видами очікування — WaitForSeconds, WaitForSecondsRealtime, WaitForEndOfFrame і WaitForFixedUpdate. На практиці створюється корутина, яка чекає заданий час і знищує об’єкт стріли, забезпечуючи її автоматичне зникнення з поля.
- Композиція та успадкування7:21
Порівнюються успадкування та композиція на прикладі коду персонажа і стріли, після чого стріла переробляється з матеріального зіткнення на тригер: прибирається попередній скрипт, що завдавав шкоди лише через анімацію, і створюється окремий компонент з методом OnTriggerEnter2D, який отримує компонент Health протилежного об’єкта і завдає шкоди при дотику.
- Поворот стріли10:36
Налаштовується автоматичне знищення стріли при зіткненні через змінну isDestroyingAfterCollision, а щоб стріла не реагувала на об’єкт, який її породив, їй передається посилання на батьківський об’єкт з перевіркою перед завданням шкоди. Напрямок польоту стріли прив’язується до повороту персонажа через flipX, а для розвороту стріли ліворуч використовується поворот об’єкта по осі Y через Quaternion.Euler, оскільки її колайдер несиметричний.
- Розбір ДЗ – анімація вовка6:01
-
Розділ розбирає джерела навантаження на процесор, а потім замінює повторювані виклики GetComponent та Instantiate пулом об’єктів і словником GameManager; окремо збирається система баффів.
- Вступ до оптимізації9:18
Урок пояснює, як процесор і відеоядро формують кадр гри, і вводить поняття бюджету часу на кадр за 60 кадрів на секунду. Розглядаються основні джерела навантаження на процесор у мобільних іграх: методи Update, створення об’єктів і робота збирача сміття, а також вбудовані методи GetComponent, Instantiate та FindObjects.
- Позбавлення від GetComponent9:35
Урок розбирає зайвий виклик GetComponent після Instantiate в коді стрільби персонажа і показує, як отримувати посилання на потрібний компонент одразу під час створення об’єкта — передачею в Instantiate типу компонента замість GameObject. Також пояснюється, коли велика кількість компонентів MonoBehaviour на об’єкті створює проблему для продуктивності, а коли ні.
- Позбавлення від Instantiate7:38
Урок показує перехід від створення стріл через Instantiate під час кожного пострілу до їх повторного використання через пул на основі List. Розглядається, чому для пула не підходить масив, і створюється список стріл, які заздалегідь створюються, вимикаються методом SetActive(false) і розміщуються всередині Arrow Spawn Point.
- Робота з пулом ігрових об’єктів11:42
Урок підключає підготовлений пул до ігрового процесу: реалізуються методи отримання стріли з пула та її повернення назад замість видалення. Для універсального знищення об’єктів створюється інтерфейс IObjectDestroyer, який скрипт Arrow використовує, щоб повертати себе в пул через посилання на клас Player.
- Створення GameManager9:43
Урок вводить централізований об’єкт GameManager з патерном Singleton, який через словник заздалегідь збирає посилання на компоненти Health з усіх об’єктів сцени. Перший спосіб заповнення словника — пошук усіх компонентів методом FindObjectsOfType і додавання їх у словник циклом foreach; зазначається, що такий спосіб збільшує час завантаження сцени.
- Робота з Dictionary4:14
Урок показує перехід від пошуку компонентів методом GetComponent до їхньої реєстрації у словнику GameManager: скрипт Health сам додає себе до словника під час ініціалізації сцени. У скрипті TriggerDamage перевірка на null замінюється перевіркою наявності ключа методом ContainsKey, а для роботи синглтона створюється об’єкт GameManager, запакований у префаб.
- Виправлення платформ і анімація монет10:14
Урок усуває залипання персонажа на платформах за допомогою компонента Platform Effector 2D з налаштованим кутом взаємодії, щоб спрацьовування відбувалося тільки зверху. Доопрацьовується анімація монети: підбирається новий спрайт і його розмір, додається зациклене мерехтіння і погойдування відносно батьківського об’єкта, щоб монети не зводило в одну точку.
- Синхронізація монет з GameManager6:49
Урок додає монеті анімацію зникнення через Animation Event, який після завершення анімації знищує об’єкт. Збір монет переводиться з перевірки за тегом на використання словника CoinContainer у GameManager: скрипт Coin реєструє себе в контейнері, а PlayerInventory перевіряє належність об’єкта методом ContainsKey перед збільшенням лічильника.
- Графічне оформлення рівня9:34
Урок присвячений візуальному оформленню рівня: спрайти платформ замінюються на зображення грибів із налаштуванням масштабу, точки опори, шару відмальовування та колайдера Edge Collider 2D. Задній фон прив’язується до гравця як дочірній об’єкт зі зміщеним шаром відмальовування, а колайдер персонажа коригується, щоб усунути відчуття левітації під час ходьби.
- Система баффів9:09
Урок описує архітектуру системи ігрових баффів: об’єкт-джерело, який накладає баф, і скрипт-приймач, який змінює параметри персонажа — швидкість, урон, силу стрибка. Вводяться адитивний і мультиплікативний способи зміни параметра, перелічення для розділення типів баффів і атрибут Serializable, щоб поля класу Buff відображалися в інспекторі Unity.
- Опис баффів4:58
Урок продовжує систему баффів реалізацією приймача BuffReceiver, який зберігає застосовані бафи у списку. Нарахування і зняття бафа відбуваються через тригерні події OnTriggerEnter2D і вихід із тригера, з перевірками на дублювання в списку перед додаванням і на наявність бафа перед видаленням.
- Вступ до оптимізації9:18
-
Розділ розбирає будову UI Unity — Canvas, Rect Transform і компоненти інтерфейсу — і доводить їх до робочих екранів: шкали здоров’я, меню та збереження імені гравця.
-
Розділ вводить будову Canvas і Rect Transform, програмування текстових полів і кнопок та збирає анімовану шкалу здоров’я персонажа.
- Введення в користувацький інтерфейс (UI)7:35
UI-елементи в Unity — це об’єкти сцени з компонентом Rect Transform і позиціонуванням за якорями, обов’язково вкладені в Canvas. Розглядаються три режими відображення Canvas: Screen Space Overlay закріплює інтерфейс поверх екрана, World Space розміщує елементи у світових координатах сцени, а Screen Space Camera підлаштовується під камеру з регулюванням віддаленості через Plane Distance.
- Налаштування Canvas7:40
Розбирається компонент Canvas Scaler і його режими масштабування інтерфейсу під різні роздільні здатності та співвідношення сторін екрана — Constant Pixel Size, Constant Physical Size і Scale With Screen Size з еталонною роздільною здатністю. Показано налаштування якоря та пайвота, яке утримує текстовий елемент у кутку екрана при зміні співвідношення сторін.
- Робота з UI в коді3:49
Текстове поле лічильника монет донастроюється візуально, а потім через скрипт PlayerInventory програмується виведення та оновлення кількості зібраних монет у компоненті Text за допомогою підключення бібліотеки UnityEngine.UI. Текст оновлюється конкатенацією рядків в обробнику OnTriggerEnter2D під час підбирання предметів персонажем.
- Кнопка (Button)8:29
Створюється інтерфейсна кнопка на Canvas, її зовнішній вигляд налаштовується через компонент Image, а поведінка — через компонент Button з параметрами Interactable і Transition. Публічний метод у скрипті GameManager прив’язується до події OnClick і обнуляє Time.timeScale, реалізуючи паузу та відновлення гри повторним натисканням.
- Content Size Filter9:43
Розбирається компонент Content Size Filter, який змінює розмір UI-об’єкта залежно від вмісту, на прикладі лічильника монет з іконкою — налаштовуються окремі параметри по горизонталі та вертикалі й вимикається автоматичне стискання шрифту Best Fit. Кількість монет виводиться через приведення цілого значення до рядка методом ToString().
- Створення HealthBar6:16
Зображення смуги здоров’я готується до розтягування: в Sprite Editor розмічаються межі нерозтяжної зони, а в Sprite Renderer режим відображення перемикається з Simple на Sliced. Тип меша спрайту переводиться у FullRect, у результаті виходить спрайт, що розтягується по горизонталі без спотворень країв.
- Налаштування Image3:54
Шкала здоров’я збирається з підкладки та заповнюваної дочірньої частини на компонентах Image з увімкненим режимом Filled. Налаштовуються Fill Method, Fill Origin і Fill Amount, обирається горизонтальне заповнення зліва направо для відображення поточного здоров’я.
- Програмування прогресбарів5:51
Створюється скрипт HealthBar, який зчитує здоров’я персонажа через Singleton або FindObjectOfType і в методі Update оновлює заповнення шкали діленням поточного здоров’я на максимальне значення. Розбирається помилка цілочисельного ділення, через яку дільник записується як дробове число із суфіксом f.
- Анімація прогресбарів7:48
Різка зміна шкали здоров’я замінюється плавною анімацією через допоміжну змінну HealthValue, яка на кожному кадрі наближається до реального значення здоров’я на крок Delta. Розбирається помилка порівняння цілого значення здоров’я з дробовим HealthValue і вводиться змінна currentHealth; зазначається можливість використати замість методу Update корутину.
- Введення в користувацький інтерфейс (UI)7:35
-
Розділ збирає сцену ігрового меню з кнопками «Грати» та «Вихід», переходи між сценами та збереження імені гравця через PlayerPrefs.
- Розмітка меню8:58
Створюється сцена ігрового меню з фоновою панеллю, розтягнутою за розмірами Canvas, і кнопками «Грати» та «Вихід», розміщеними в контейнері з компонентом VerticalLayoutGroup. Розбирається відмінність GridLayoutGroup, HorizontalLayoutGroup і VerticalLayoutGroup, а положення кнопок налаштовується через Child Alignment.
- Layout Group Components5:09
Розбираються параметри Vertical Layout Group — Child Force Expand, Control Child Size і Spacing — для налаштування розташування кнопок меню, а також застосування Content Size Fitter і Layout Element для підлаштування розмірів об’єктів. Показано додавання сцен проєкту до списку Scenes in Build із зазначенням стартової сцени меню.
- Програмування меню4:23
Пишеться скрипт меню з публічними методами для кнопок «Грати» та «Вихід»: метод onClickPlay через клас SceneManager завантажує ігрову сцену методом LoadScene за номером або назвою, а метод виходу викликає Application.Quit. Методи прив’язуються до кнопок через список подій OnClick.
- PlayerPrefs та InputField10:52
Налаштовується поле введення Input Field для імені персонажа, а введене значення зберігається на пристрої через клас PlayerPrefs методом SetString за подією OnEndEdit. При старті сцени збережене значення перевіряється методом HasKey і підвантажується в поле методом GetString.
- Розмітка меню8:58
-
-
Розділ будує базу даних предметів на ScriptableObject із власним редакторським інтерфейсом, інтерфейс комірок інвентарю та застосування бафів від предметів через делегат Action.
- ScriptableObject8:56
Розглядається відмінність ScriptableObject від MonoBehaviour як самостійного файлу даних. Створюється скрипт предмета Item з полями id, item name, description, buff type та value, а атрибут CreateAssetMenu додає створення такого предмета через меню Create в редакторі Unity.
- ScriptableObject у базах даних8:11
Показується, як посилання на ScriptableObject передається в інший компонент для звернення до даних предмета з коду. Створюється клас-контейнер ItemBase, що зберігає список предметів замість окремих файлів, з методами створення та видалення елементів.
- Розробка бази даних предметів8:54
Додається навігація по списку предметів через currentIndex методами nextItem і previousItem. Створюється Editor-скрипт з перевизначеним методом OnInspectorGUI, який додає до інспектора бази даних кнопки створення, видалення та переходу між предметами.
- Написання Editor-скрипта3:24
До бази даних через кнопки редакторського інтерфейсу додається кілька предметів з різними параметрами. Кнопки керування групуються в горизонтальний ряд методами GUILayout.BeginHorizontal і EndHorizontal замість вертикального списку.
- Робота з базою даних8:06
Створюється компонент ItemComponent, який отримує дані предмета з бази за ідентифікатором, обгорнутим у перелічення ItemType. У GameManager додається пошук елемента за ID циклом і через лямбда-вираз у методі Find, а до бази додається поле спрайта для відображення іконки предмета.
- Додавання предметів до інвентарю10:10
На основі префаба монетки створюється префаб зілля з компонентом ItemComponent, підключеним до бази даних через GameManager. У GameManager заводиться словник предметів, скрипт інвентарю перевіряє зіткнення з об’єктом зі словника і додає предмет до списку зібраних, видаляючи його зі сцени через інтерфейс знищення об’єкта.
- Інтерфейс інвентарю6:07
На канвасі збирається панель інвентарю із сіткою комірок на компоненті Grid Layout Group і кнопками-комірками з LayoutElement. Пишеться скрипт комірки з методом ініціалізації, який приймає предмет і підставляє його іконку в дочірнє зображення.
- Контролер інвентарю10:00
Створюється Inventory UI Controller, який отримує список предметів із Player Inventory через Game Manager і заповнює комірки інтерфейсу. Відкриття панелі прив’язується до кнопки паузи, комірки збираються через Instantiate за префабом, а ініціалізація переноситься зі Start в onEnable, щоб усунути помилку відображення предметів при повторному відкритті вікна.
- Делегат Action9:53
На гравця додається компонент Buff Receiver, а в комірці створюється метод OnClickSell, який застосовує предмет до гравця за натисканням кнопки і видаляє його з інвентарю. Замість постійної перевірки бафів в Update вводиться делегат Action, на який підписується тестовий метод гравця.
- Обробка натискань комірок2:33
До кнопки комірки через Unity-події прив’язується метод OnClickCell, який видаляє предмет з даних Game Manager і передає баф у Buff Receiver гравця методом addBuff. Buff Receiver додає баф до списку за його відсутності та викликає делегат, який спрацьовує лише при зміні бафів, а не щокадру.
- Домашнє завдання: бафи та інвентар1:29
Домашнє завдання: перейменувати тестовий метод обробки бафів і додати гравцю поля Force Bonus, Armor Bonus та Damage Bonus, що впливають на базові змінні Force, Damage і Health. Також потрібно доопрацювати Inventory UI Controller через Action, щоб натискання на комірку оновлювало весь список предметів інтерфейсу.
- ScriptableObject8:56
-
Розділ вводить систему контролю версій — репозиторій на GitLab, роботу в SourceTree та гілки Git — і переводить керування персонажем на екранні кнопки для мобільних пристроїв.
- Розбір ДЗ8:48
Урок розбирає реалізацію домашнього завдання: анімацію предметів, оновлення інтерфейсу інвентаря через систему підписки Action і застосування бонусів бафів до сили, урону та здоров’я гравця. Показано, як винести логіку знищення об’єкта в окремий інтерфейс і коректно обробити порожній слот інвентаря.
- Розбір ДЗ 23:53
Урок продовжує розбір домашнього завдання: показано застосування бонусу сили до стрибка персонажа, бонусу здоров’я при використанні зілля та бонусу урону при пострілі стрілою. Робота кожного бафа перевіряється в грі порівнянням результату зі стандартною поведінкою персонажа.
- Вступ до системи контролю версій11:05
Урок вводить поняття системи контролю версій та її клієнт-серверну структуру, показує реєстрацію в GitLab і створення приватного репозиторію проєкту. Також розбирається створення файлу gitignore для Unity через сервіс gitignore.io, щоб локальні файли збірки та налаштувань середовища розробки не потрапляли на сервер.
- Робота з SourceTree8:29
Урок пояснює базовий цикл роботи з SourceTree: створення локального репозиторію, коміт і відправку змін у GitLab. Також показано перегляд історії комітів і перемикання між версіями проєкту.
- Гілки в Git9:37
Урок пояснює роботу з гілками Git: створення окремої гілки, незалежну розробку в ній і злиття з основною гілкою master. Розбирається природа конфлікту злиття та його розв’язання через вибір потрібної версії файлу.
- Верстка екранного керування9:56
Урок показує верстку екранних кнопок керування — рух, стрибок, стрільба — на Canvas для мобільних пристроїв. Оскільки стандартний компонент Button не відстежує утримання, для кнопок пишеться власний скрипт з обробкою натискання та відпускання через Event Trigger, а дані про натиснуті кнопки виносяться в окремий контролер введення.
- Створення контролера для екранних кнопок6:30
Урок показує, як викликати методи персонажа з UI-кнопок через код замість ручного призначення onClick у редакторі, використовуючи підписку AddListener і передачу посилання на контролер через наявний Singleton-патерн. Логіка стрибка виноситься в окремий метод, а FixedUpdate розбивається на зрозуміліші блоки.
- Екранування коду7:23
Урок переносить керування з клавіатури на екранні кнопки через контролер і пояснює умовну компіляцію коду під редактор, яка виключає налагоджувальне введення з клавіатури з фінальної збірки. Логіка переміщення виноситься в окремий метод Move, а перевірка стрибка переноситься з FixedUpdate в Update.
- Екскурс у Particle System7:12
Урок знайомить із системою Particle System на прикладі безкоштовного набору ефектів Particle Pack і показує, що для візуальних ефектів зручніше використовувати готові префаби, а не створювати їх самостійно. Також розбирається вплив партиклів на продуктивність і складність їх вбудовування в інтерфейс.
- Про пошук інформації8:41
Урок розбирає будову компонента Particle System та його основні налаштування — колір, час життя, попередній прогрів і зациклення, а також роль рендерера і сортувальних шарів у порядку накладання ефекту. Показано, де шукати технічну інформацію з Unity та C#: офіційна документація, довідники та книги.
- Розбір ДЗ8:48
-
Розділ виправляє типові помилки проєкту — анімацію та відскок при уроні — збирає тестовий APK під Android і розбирає працевлаштування в геймдеві, монетизацію та публікацію в Google Play.
- Виправлення помилок8:47
Урок розбирає виправлення двох помилок проєкту: хибний перехід в анімацію падіння під час ходьби по платформах і відсутність візуальної реакції персонажа на отриману шкоду. Хибне спрацювання усувається заміною методу завершення зіткнення на метод утримання контакту, а реакція на шкоду реалізується через новий стан аніматора зі зміною спрайтів і короткочасною зміною кольору персонажа.
- Виправлення помилок, частина 212:56
Урок продовжує виправлення помилок проєкту: додає відскок персонажа при отриманні шкоди залежно від сторони атаки через застосування імпульсу до тіла, усуває зависання анімації шкоди заміною булевої змінної на поєднання змінної й тригера. Окремо вирішується втрата камери під час знищення персонажа перенесенням камери та фону в корінь сцени.
- Збірка проєкту під Android9:54
Урок показує підготовку та збірку Unity-проєкту під Android: встановлення Android SDK і NDK через Unity Hub, перемикання платформи в налаштуваннях збірки та налаштування параметрів проєкту в Player Settings — назви, іконки, імені пакета, мінімальної версії Android і цільової архітектури процесора. У підсумку виходить тестовий APK-файл для встановлення на пристрій.
- Рекомендації щодо працевлаштування12:03
Урок дає рекомендації щодо працевлаштування в геймдеві для програмістів і геймдизайнерів: описує реальні обов’язки цих спеціальностей — написання скриптів і налаштування префабів у програміста, розробку концепції, механік і балансу в геймдизайнера. Також розбирається формування портфоліо через публікацію проєктів на GitHub, GitLab або в Play Market, пошук вакансій і особливості співбесіди на посаду джуніора.
- Вступ до маркетингу геймдеву12:34
Урок знайомить зі способами монетизації мобільних ігор — продажем, внутрішньоігровою купівлею за моделлю free-to-play та рекламою, зокрема винагороджуваними переглядами. Також вводяться метрики оцінки успішності проєкту: ARPU, ARPPU і показники залученості DAU, WAU, MAU та Retention.
- Монетизація гри13:56
Практичний урок показує підключення сервісу Unity Ads до проєкту: імпорт плагіна Unity Monetization через Asset Store, налаштування реклами у вкладці Services та в Unity Dashboard. Розбирається готовий скрипт показу винагороджуваного відео з налаштуванням Placement ID і Game ID для iOS та Android.
- Публікація гри8:49
Урок показує процес публікації застосунку в Google Play: реєстрацію акаунта розробника, заповнення картки застосунку — назви, опису, іконки, скриншотів і рекламного зображення, налаштування тегів і вікового рейтингу. Також розбирається створення політики конфіденційності через зовнішній безкоштовний сервіс.
- Завантаження apk та Unity IAP3:33
Урок описує завершальний етап підготовки застосунку до публікації: завантаження виконуваного APK-файлу, створення релізу та проходження перевірки модератором Google Play. Окремо розбирається підключення покупок усередині застосунку через коди продуктів Google Play та Apple, які розміщуються в коді проєкту для оплати через API Google.
- Виправлення помилок8:47
Часті запитання
Тут зібрані відповіді майже на всі запитання, які ставлять перед купівлею. Натисніть на запитання, щоб розкрити відповідь.
Про цей курс
-
Ні — курс починається зі встановлення Unity та пояснення базових понять C# з нуля: типів даних, змінних, умов і циклів.
-
C# у середовищі JetBrains Rider або Visual Studio — різниця між ними переважно в обсязі підказок під час набору коду.
-
Ні, усі механіки курсу двовимірні — 2D-фізика, 2D-колайдери, спрайти. Мережевої гри та мультиплеєра теж немає, проєкт залишається однокористувацьким.
-
Збірка під iOS у курсі майже не виконується — вона лише згадується як окремий шлях, що вимагає комп’ютера з macOS і ліцензії розробника Apple.
-
Кожне завдання завантажується окремою карткою під відео, куратор перевіряє його в чаті та надсилає правки, а після здачі робота стає видна іншим учням потоку.
-
Курс показує процес публікації — реєстрацію акаунта розробника, картку застосунку та політику конфіденційності — на рівні демонстрації, а не як доведений до магазину комерційний проєкт: реєстрація акаунта розробника Google Play вимагає окремої платної процедури поза курсом.
Доступ і матеріали
-
Одразу після оплати, тієї ж секунди й автоматично. Чекати на підтвердження не потрібно. Доступ надходить двома шляхами водночас. Перший: на пошту, вказану при оформленні замовлення, приходить лист із посиланням на матеріали. Другий: те саме посилання з’являється у вашому акаунті на сайті, у розділі «Завантаження», і залишається там назавжди.
-
Усі відео та додаткові файли лежать у хмарному сховищі. Посилання на нього — у вашому акаунті на сайті, розділ «Завантаження», і в листі, який надійшов після оплати. Акаунт тут не формальність, а спосіб доставки: курс залишається в ньому назавжди. Навіть якщо лист загубився або ви згадали про купівлю через рік, посилання буде на місці.
-
Завантажувати можна і варто. Радимо зберегти відео на комп’ютер і дивитися звідти. Причина проста: хмарне сховище не розраховане на перегляд відео. Іноді воно дозволяє увімкнути ролик просто у браузері, але якість при цьому помітно гірша за вихідну. На своєму комп’ютері ви побачите курс таким, яким його записували.
-
Безстроково. Курс залишається вашим назавжди, повертатися до нього можна скільки завгодно разів. Якщо через рік чи два посилання раптом перестане відкриватися з технічних причин — напишіть на info@siluette.com.ua, ми його відновимо.
-
Насамперед: доступ у вас є в будь-якому разі. Увійдіть на сайт і відкрийте розділ «Завантаження» — посилання на курс уже там, незалежно від того, дійшов лист чи ні. Найчастіше лист губиться через одруківку в адресі під час оформлення замовлення. Ще варто заглянути до теки «Спам». Не виходить розібратися — не витрачайте час: напишіть на info@siluette.com.ua або в чат у правому нижньому куті сайту, ми допоможемо.
-
Найкраще на комп’ютері або ноутбуці: завантажте відео й відкрийте будь-яким звичним плеєром. Знадобляться встановлені відеокодеки — на більшості комп’ютерів вони вже є. Завантажити курс можна на скільки завгодно пристроїв. А от телефон ми не радимо, і з двох причин. На маленькому екрані погано видно деталі, особливо якщо в уроці показують інтерфейс програми. І на телефонах часто немає кодеків для форматів, у яких записані відео.
Оплата та повернення
-
Банківською карткою Visa, MasterCard або «Простір», через Google Pay, Apple Pay, Masterpass, Visa Checkout, платіжний QR-код, Botpay у Telegram чи Privat24. Є й оплата частинами: Монобанк (3 або 4 платежі), А-Банк (2, 3 або 4 платежі та розстрочка), Банк Глобус (8 платежів), «Скибочка» від OTP Bank (3 платежі), миттєва розстрочка та оплата частинами від ПриватБанку.
-
Так. Платіжна система приймає картки з Євросоюзу та будь-яких інших країн. Одна деталь, про яку часто забувають: банк може попросити підтвердити платіж — у мобільному застосунку або кодом із СМС. Якщо оплата не проходить, перевірте застосунок банку та повідомлення.
-
Додайте до кошика два курси або більше — знижка застосується автоматично до всіх товарів у кошику. Два курси: мінус 20% на обидва. П’ять курсів: мінус 20% на всі п’ять. Знижка поєднується з будь-якими акційними цінами й діє на весь каталог без винятків.
-
Цифрові товари поверненню та обміну не підлягають. Це загальне правило для всіх електронних товарів в Україні — постанова Кабінету Міністрів № 172 від 19 березня 1994 року. При цьому ми завжди на зв’язку. Якщо доступ не відкривається, посилання перестало працювати або файли пошкоджені — напишіть на info@siluette.com.ua, вкажіть дату та номер замовлення. Відновимо. Якщо щось незрозуміло в самому курсі, теж пишіть — підкажемо.
-
Поки що ні. Ми працюємо лише з приватними покупцями — безготівкової оплати за рахунком від юридичних осіб зараз немає.
Як проходить навчання
-
Ні. Усі курси — це записи уроків для самостійного вивчення: викладач не відповідає на запитання і не перевіряє домашні завдання. Саме тому курси коштують значно дешевше за навчання з куратором. Ви отримуєте той самий матеріал, але займаєтеся самі та у своєму темпі.
-
Так, цифровий сертифікат — на запит і безкоштовно. Напишіть на info@siluette.com.ua, вкажіть ім’я та прізвище саме в тому вигляді, в якому хочете бачити їх у сертифікаті, і ми надішлемо його протягом доби.
-
Для більшості курсів — ні. Вони розраховані на початковий рівень і пояснюють з азів. Якщо курс потребує підготовки, це сказано в його описі.
-
Ні. Ані дедлайнів, ані розкладу, ані доступу, що згорає. Завантажили — дивіться коли зручно, з будь-якими перервами.
-
Курс купується для особистого використання, і ми просимо ставитися до цього по-людськи: за кожним уроком стоїть робота, а ціна й так суттєво знижена.
Підтримка
-
Найкраще на info@siluette.com.ua. Є й чат у правому нижньому куті сайту, але пошта надійніша: там можна все описати докладно та додати знімки екрана. Прохання: опишіть, що саме ви робили і що пішло не так, та додайте знімок екрана з помилкою. Так ми вирішимо питання одразу, а не з’ясовуватимемо півдня, що сталося.
-
У робочий час, з 9:00 до 19:00, на пошту зазвичай відповідаємо протягом години, у чаті — за кілька хвилин. Після 19:00 теж буває, але час відповіді не обіцяємо.


Відгуки покупців
01.10.2026 Підтверджений клієнт
Загалом займаюся із задоволенням, матеріал виглядає зрозумілим і впорядкованим. Іноді пояснення трохи затягується на одному моменті, але це не псує враження.
26.09.2026 Підтверджений клієнт
Коли я додав перевірку зіткнення, виявилося, що вона спрацьовує і на платформі, а не лише під час контакту з противником. Спочатку вирішив, що неправильно налаштував фізику, але в уроці добре показано, що обробник бачить будь яке торкання колайдерів. Я перевірив це на своїй сцені і вивів назву зустрінутого об'єкта, так стало легше зрозуміти поведінку. Потім налаштував значення шкоди окремо для персонажів і пов'язав контакт із потрібною дією. Сподобалося, що спочатку розбирається сама причина, а не пропонується просто переписати код. Після перевірки стало набагато зрозуміліше, на якому етапі потрібно обмежувати реакцію і як далі розвивати механіку.
22.09.2026 Підтверджений клієнт
Пояснюють дбайливо і без складних слів, я багато чого зрозуміла. Часом хотілося зупинити відео і спокійно повторити кроки, бо темп подекуди для мене швидкий.
18.09.2026 Підтверджений клієнт
Перенесення керування на екранні кнопки в мене не одразу склалося. Кнопка вогню викликала потрібну дію, а стрибок то спрацьовував, то ні, поки я не розділила обробку руху і стрибка та не перевірила, звідки саме береться натискання. Після перенесення перевірки клавіатури в окрему ділянку для редактора стало зручніше тестувати гру на комп'ютері, не змішуючи це введення з тим, що піде на телефон. Потім запустила сцену і перевірила кнопки на екрані, зокрема за іншого співвідношення сторін. Сподобалося, що зміни показано на знайомому персонажі, а не на абстрактному прикладі. Зрештою стало зрозуміліше, навіщо відокремлювати тестове керування від основного.
14.09.2026 Підтверджений клієнт
Матеріал загалом зрозумілий, займатися можна без поспіху. Іноді пояснення затримується на деталях, і я відволікався, але основні думки розібрав.
08.09.2026 Підтверджений клієнт
Властивості були для мене тим місцем, де я плуталася між тим, що зберігається всередині класу, і тим, що доступне ззовні. Тут стало зрозуміліше, навіщо не відкривати поле безпосередньо і як через окремі частини дозволити читання або зміну значення. Спробувала повторити приклад з обмеженням допустимого значення і спочатку помилилася в перевірці, тому значення проходило без обмежень. Перевірила умову ще раз, і стало зрозуміло, де саме задається правило. Сподобалося, що це не просто новий синтаксис, а спосіб захистити дані від випадкового редагування. Після розбору власний код читається охайніше, і простіше зрозуміти, хто і як може змінювати значення.
03.09.2026 Підтверджений клієнт
З рухом противника в мене спершу виходила дивна картина. Він їхав в один бік і не реагував на межі, хоча об'єкти для них я вже розставив. Коли прив'язав потрібні точки і перевірив, що посилання задано правильно, причина знайшлася доволі швидко. Окремо допомогло пояснення змінної напрямку, спочатку я не розумів, навіщо зберігати її окремо, якщо можна просто задати швидкість. Після цього патруль запрацював як задумано, противник став ходити між двома позначками. Сподобалося, що значення швидкості можна змінювати просто під час перевірки, одразу видно, як воно впливає на рух.
30.08.2026 Підтверджений клієнт
Сподобалося, що ефекти можна не лише додавати, а й прибирати, коли об'єкт виходить із потрібної області. Пояснення спокійне і зрозуміле, загальна логіка склалася.
17.08.2026 Підтверджений клієнт
Загалом займатися зручно, матеріал подано послідовно і без зайвої помпезності. Іноді окремі пояснення йдуть трохи повільніше, ніж мені потрібно.
04.08.2026 Підтверджений клієнт
Лічильник монет через код виявився зрозумілим продовженням уже зібраного інтерфейсу. Показано, як передати тексту нове значення під час підбирання, хоча темп пояснення місцями доволі докладний.