Розробка вашої першої гри за допомогою Unity та C#

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

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

Що таке Unity

Unity - це ядро ​​та інфраструктура, що утворюють систему для розробки дво- та тривимірних ігор або сцен у додатках (і навіть 2.5D). Я згадую ігри та програми тому, що зустрічав не тільки ігри, а й навчальні симулятори, програми екстреного реагування (first-responder applications) та інші програми, орієнтовані на бізнес, які розроблялися за допомогою Unity і повинні були забезпечувати взаємодію з дво- та тривимірним простором. Unity дозволяє оперувати не тільки кодом, а й візуальними компонентами з подальшим їх експортом на будь-яку поширену мобільну платформу, а також робити багато іншого, причому безкоштовно. (Існує і професійна версія, але вона не безкоштовна. Втім, навіть безкоштовна версія дозволяє робити вражаючі речі.) Unity підтримує всеосновні 3D-програми, безліч форматів звуку і навіть розуміє формат PSD (Photoshop), тому ви можете просто закинути файл PSD в проект на Unity. Unity дозволяє імпортувати та збирати ресурси, писати код, що взаємодіє з вашими об'єктами, створювати або імпортувати анімації для використання з просунутою системою анімації та багато іншого.

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

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

розробка
Мал. 1. Платформи, що підтримуються Unity

Ймовірно, найпотужніша частина Unity – це Unity Asset Store; мабуть, найкращий електронний майданчик для придбання ігрових ресурсів. Тут ви знайдете всі необхідні компоненти для своїх ігор, такі як художні рішення, тривимірні моделі, анімаційні файли для тривимірних моделей (див. контент Mixamo в магазині для більш ніж 10 000 рухів), звукові ефекти та повні треки, плагіни (у тому числі, інструментальний набір MultiPlatform, що допомагає підтримувати кілька платформ), візуальні скриптові системи на кшталт PlayMaker і Behave, просунуті шейдери, текстури, ефекти на основі частинок та ін. Більшість професійних розробників ігор (якщо не всі) використовує низку пакетів з цього магазину ресурсів, і якщо ви можете запропонувати щось пристойне, публікуйте його там.

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

І чим Unity не є

Я маю сумнів, що потрібно описувати все, чим Unity не є. Однак Unity за умовчанням не є системою, в якій проектують двомірні ресурси та тривимірні моделі (крім террейнів). Ви можете вставити групу зомбі в сцену та керувати ними, але створити самих зомбі за допомогою інструментарію Unity, запропонованого за умовчанням, не можна. У цьому сенсі Unity не є інструментом створення ресурсів, подібним до Autodesk Maya, 3DSMax, Blender або навіть Adobe Photoshop. Однак існує мінімум один сторонній плагін (ProBuilder) для моделювання тривимірних компонентів у середовищі Unity; також є плагіни для побудови двомірних світів, наприклад 2D Terrain Editor, що дозволяє створювати двомірні тайлові середовища (2D tiled environments). І ще ви можете проектувати террейни в Unity, використовуючи його Terrain Tools, щоб створювати чудові ландшафти з деревами, травою, горами і т. д. Тому я знову в сумніві: чи варто окреслювати межі можливостей Unity.

Яка роль Microsoft? Microsoft і Unity тісно співпрацюють, щоб забезпечити повну підтримку всього стека платформ Microsoft. Unity підтримує автономні виконувані файли Windows, програми Windows Phone, Windows Store, Xbox 360 і Xbox One.

Приступаємо до роботи

Завантажте найновішу версію Unity і придбайте собі двокнопкову мишу з натискним коліщатком прокручування. Безкоштовна та професійна версія завантажуються як єдиний пакет, який потім ліцензується відповідним чином. Вивчити різницю між цими версіями можна на сторінці unity3d.com/unity/licenses. Editor, який є основним інтерфейсом Unity, виконується у Windows (включаючи Surface Pro), Linux та OS X.

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

Архітектура та компіляція

Unity дозволяє тестувати вашу гру в IDE, не вимагаючи жодного експорту чи збирання. Запускаючи код Unity, ви використовуєте Mono версії 3.5, API якого приблизно на одному рівні сумісний з .NET Framework 3.5/CLR 2.0.

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

Для налагодження запустіть MonoDevelop із Unity. MonoDevelop має плагін, який відкриває зворотне з'єднання з відладчиком Unity і видає йому команди після того, як ви вибираєте Debug Attach to Process in MonoDevelop. За допомогою UnityVS ви встановлюєте зворотне з'єднання з відладчик Visual Studio замість Unity.

При першому відкритті Unity ви побачите діалог проекту, показаний на мал. 2 .

вашої
Мал. 2. Project Wizard у Unity

У діалозі проекту ви вказуєте ім'я та місцезнаходження свого проекту (1). Ви можете імпортувати будь-які пакети в проект (2), хоча відзначати все тут не обов'язково; список надається лише для зручності. Пакет можна імпортувати і пізніше. Пакет - це файл .unitypackage, який містить попередньо упаковані ресурси (моделі, код, сцени, плагіни та все, що можна запакувати в Unity); ці ресурси можна повторно використовувати та розповсюджувати. Але не помічайте щось тут, якщо ви не знаєте, що це таке; розмір вашого проекту може збільшитися, причомудуже значно. Нарешті ви можете вибрати 2D або 3D (3). Цей список, що розкривається, з'явився в Unity порівняно недавно, оскільки до цього в Unity не було серйозного інструментарію для розробки двовимірних ігор. При виборі 3D налаштування за замовчуванням встановлюються на користь 3D-проекту - це типова поведінка Unity. Якщо ви вибираєте 2D, Unity змінює кілька начебто малих, але насправді дуже важливих деталей, про які я розповім в одній із наступних статей.

Цей список заповнюється з файлу .unitypackage у певних місцях вашої системи; Unity надає великий вибір під час встановлення. Все, що ви завантажуєте з магазину ресурсів Unity, теж надходить у вигляді файлу .unitypackage і локально кешується у вашій системі шляхом C:\Users\ AppData\Roaming\Unity\Asset Store. Як такий, цей файл з'явиться у списку, якщо він є у вашій системі. Ви могли б просто двічі клацнути будь-який файл .unitypackage, і він був би імпортований у ваш проект.

Продовжуючи розглядати інтерфейс, я клацну Create у діалозі з мал. 2 , щоб створити новий проект. Розмітка вікна Unity за умовчанням наведена нарис. 3.

вашої
Мал. 3. Вікно Unity за промовчанням

Ось що ми бачимо.

  1. Project Усі файли у проекті. Для додавання файлів до проекту їх можна просто перетягувати з Explorer до Unity.
  2. Scene Поточна відкрита сцена.
  3. Hierarchy Всі ігрові об'єкти в сцені. Зверніть увагу на термін GameObjects і меню GameObjects, що розкривається.
  4. Inspector Компоненти (властивості) обраного в сцені об'єкта.
  5. Toolbar Ближче до лівого краю розміщуються кнопки Pan, Move, Rotate, Scale, а в центрі - Play, Pause, Advance Frame. Play майже миттєво запускає гру без виконанняокремих збірок. Pause призупиняє гру, а Advance Frame забезпечує покадрове виконання, надаючи вам дуже жорсткий контроль налагодження.
  6. Console Це вікно може стати зрозумілим не відразу, але в ньому відображається висновок процесу компіляції, помилок, попереджень і т. д. Крім того, в ньому показуються повідомлення налагодження з коду, наприклад Debug.Log відображатиме свій висновок тут.

Важливо згадати про вкладку Game поряд із вкладкою Scene. Вона стає активною, коли ви клацаєте Play і ваша гра починає виконуватись у цьому вікні. Це називається режимом гри (play mode) та створює вам ігровий майданчик для тестування вашої гри; можна навіть «на льоту» вносити зміни до гри, перемикаючись назад на вкладку Scene. Але будьте обережні. Поки підсвічується кнопка Play, ви перебуваєте в режимі гри, і якщо ви залишаєте його, будь-які зміни, внесені в режимі гри, будуть втрачені. Я, як і майже всі розробники на Unity, з ким мені доводилося розмовляти, саме так втрачали виконану роботу, тому раджу змінити колір Editor на такий, яким було б очевидно, коли ви знаходитесь в режимі гри. Це можна зробити через Edit Preferences Colors Playmode tint.

Все, що виконується у вашій грі, існує у сцені.

Все, що виконується у вашій грі, існує у сцені. Коли ви упаковуєте гру для якоїсь платформи, кінцевий продукт є однією або більше сцен плюс будь-який доданий вами код, специфічний для конкретної платформи. Кількість сцен у проекті не обмежена. Сцену можна розглядати як рівень у грі, хоча в одному файлі сцени може бути кілька рівнів – достатньо переміщати гравця (камеру) до інших позицій сцени. Завантажуючи сторонні пакети або навіть приклади ігор із магазинуресурсів, ви зазвичай повинні знайти файли сцени, щоб відкрити їх у своєму проекті. Файл сцени містить різноманітні метадані про ресурси, що використовуються в проекті для поточної сцени та її властивостей. Важливо частіше зберігати сцену розробки натисканням клавіш Ctrl+S, як й у будь-якому іншому інструментарії.

Як правило, Unity відкриває останню сцену, з якою ви працювали, хоча іноді, коли Unity відкриває проект, створюється нова порожня сцена і вам доведеться шукати сцену в Project Explorer. Початківців це збиває з пантелику, але важливо пам'ятати про це, якщо ви раптом відкрили свій останній проект і не можете зрозуміти, куди поділася вся ваша робота! Розслабтеся, ви знайдете у файлі сцени, який ви зберегли у своєму проекті. Ви можете шукати всі сцени в проекті, клацнувши значокрис. 4, і вибравши у списку Scene.

вашої
Мал. 4. Фільтрація сцен у проекті

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

Структура проекту та імпорт ресурсів

Проекти Unity не подібні до проектів Visual Studio. Ви не відкриваєте файл проекту або навіть рішення, тому що таких файлів немає. Ви вказуєте Unity структуру папок та відкриваєте папку як проект. Проекти містять папки Assets, Library, ProjectSettings і Temp, але в інтерфейсі з'являється лише папка Assets, що можна було помітити на мал. 4 .

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

Папка Library – це локальний кеш для імпортованих ресурсів; вона містить усі метадані для ресурсів. У папці ProjectSettings зберігаються налаштування, задані вами в Edit Project Settings. Папка Temp використовується для тимчасових файлів, створюваних Mono та Unity у процесі збирання проекту.

Вкрай важливий GameObject

Майже всі у вашій сцені є GameObject. Згадайте System.Object у .NET Framework. Від нього успадковують багато типів. Така сама концепція відноситься і до GameObject. Це базовий клас для всіх об'єктів у сцені Unity. Усі об'єкти, показані на мал. 5 (і багато інших), успадковують від GameObject.

розробка
Мал. 5. Клас GameObject в Unity