Ръководството за крайни начинаещи за разработване на игри в единство

Unity е чудесен инструмент за прототипиране на всичко - от игри до интерактивни визуализации. В тази статия разглеждаме всичко, което трябва да знаете, за да започнете да използвате Unity.

Първо, малко за мен: Аз съм разработчик на хобистки единства, 3D моделист и графичен дизайнер, който работи с Unity и Blender повече от 5 години. Сега съм студент по финансови математики в Университетския колеж в Дъблин и от време на време правя графичен дизайн на свободна практика, създаване на прототипи в мрежата и прототипиране на игри.

Въведение

Тази статия е насочена към всеки, който никога преди не е използвал Unity, но има известен опит в програмирането или в уеб дизайна / разработката. До края на тази статия трябва да имате добър общ преглед на двигателя, както и всички необходими функции и код, за да започнете да правите основна игра.

Защо Единство?

Ако искате да правите игри

Наистина има много малко възможности, когато става въпрос за разработване на независими игри. Трите основни избора, ако искате да създавате игри, са Unreal, Unity или GameMaker.

Unity е може би най-малко склонният от трите платформи. Той ви дава много суров продукт от кутията, но е изключително гъвкав, добре документиран и разтегателен, за да изградите почти всеки жанр игра, за който се сетите.

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

В действителност двигателят, върху който изграждате първата си игра, вероятно не е критичен, така че моят съвет е просто да изберете една и да продължите с нея.

Ако искате да прототипирате потребителски опит

Тъй като единството е само двигател с куп физика, анимация и 3D рендиране в реално време, това е и чудесно пространство за създаване на пълноценни интерактивни прототипи за UX изследвания.

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

Раздели към тази статия

  • Защо Единство?
  • Прозорец на Unity Editor
  • Обекти на Unity Game
  • Unity вградени компоненти
  • Създаване на потребителски компоненти
  • Структура на моно поведението
  • Манипулиране на GameObjects
  • Raycasting
  • Откриване на сблъсък
  • Разширени функции
  • Съвети за новодошлите
  • Приятни ресурси и общности
  • Заключение

Прозорец на редактора на Unity

Прозорецът на редактора е разделен на няколко раздела. Ще разгледаме това накратко, тъй като ще се позоваваме постоянно на него в цялата статия. Ако вече сте запознати с това, просто прескочете миналото!

Scene View: Позволява поставяне и движение на GameObjects в Scene Game View: Преглежда как играчът ще вижда сцената от камерата Инспектор: Предоставя подробности за избрания GameObject в сцената. Активи / Проект: Тук се съхраняват всички сглобяеми елементи, текстури, модели, скриптове и т.н. Йерархия: Позволява влагане и структуриране на GameObjects в сцената

Сега е добре да започнем!

Обекти на Unity Game

Какво представляват GameObjects

GameObjects са основният градивен елемент на всичко в механизма за игри на Unity. Името почти го раздава:

Всичко, което поставите в една сцена в Unity, трябва да бъде увито в „игрален обект“.

Ако имате фон за уеб дизайн, можете да мислите за GameObjects като за много подобни елементи! Изключително скучни контейнери, но са изключително разтегателни за създаване на сложна функционалност или визуални ефекти.

Буквално всичко от ефекти на частици, камери, плейъри, елементи на потребителския интерфейс, ... (списъкът продължава) е GameObject.

Създаване на йерархия

Подобно на уеб разработката, GameObject също е контейнер. Точно както се гнездите, за да създавате разнообразни и желани оформления или абстракции, може да пожелаете да направите същото и с игрови обекти.

Логиката зад влагането на игрови обекти е почти същата като уеб разработката, ще дам няколко примера ...

Безредие и ефективност

Уеб аналогия: Имате много подобни елементи, които могат да се генерират динамично в движение в отговор на потребителското взаимодействие и искат да ги поддържат подредени. Unity Translation: Когато създавате клонинг на Minecraft и имате много блокове в сцената, трябва да добавите и премахнете „парчета“ блокове от сцената поради съображения за изпълнение. По този начин тяхното родителство за празен GameObject за всеки парче има смисъл, тъй като изтриването на родителя на парче премахва всички дъщерни блокове.

Позициониране

Уеб аналогия: Искате да запазите позицията на съдържанието, съдържащо се „относително“ към контейнера, а не към уеб страницата. Unity Translation: Създали сте куп помощни дронове, които се навъртат около плейъра. Наистина не бихте предпочели да напишете код, за да им кажете да гонят играча, затова вместо това ги създавате като деца на игралния обект на играча.

Unity вградени компоненти

Модел на актьорския компонент

GameObjects сами по себе си са доста безполезни - както видяхме, те са почти само контейнери. За да добавим функционалност към тях, трябва да добавим компоненти, които по същество са скриптове, написани на C # или Javascript.

Unity работи по модел на Actor Component, казано просто GameObjects са актьорите, а Components са вашите скриптове.

Ако сте написали някакви уеб приложения, преди да сте запознати с идеята за създаване на малки компоненти за многократна употреба, като бутони, елементи на формуляри, гъвкави оформления, които имат различни различни директиви и персонализируеми свойства. След това сглобяване на тези малки компоненти в по-големи уеб страници.

Голямото предимство на този подход е нивото на повторна употреба и ясно дефинирани канали за комуникация между елементите. По същия начин при разработването на игри искаме да сведем до минимум риска от нежелани странични ефекти. Малките грешки са склонни да излязат извън контрол, ако не сте внимателни и са изключително трудни за отстраняване на грешки. По този начин създаването на малки, здрави и многократно използвани компоненти е от решаващо значение.

Ключови вградени компоненти

Мисля, че е време за няколко примера за вградени компоненти, предоставени от двигателя Unity Games.

  • MeshFilter: Позволява ви да присвоите материали на 3D мрежа към GameObject
  • MeshRender: Позволява ви да присвоявате материали на 3D мрежа
  • [Кутия | Mesh] Collider: Позволява откриване на GameObject по време на сблъсъци
  • Rigidbody: Позволява реалистична физическа симулация да въздейства върху GameObjects с 3D мрежи и ще задейства събития за откриване на колайдарите
  • Светлина: Осветява части от вашата сцена
  • Камера: Определя изгледа на плейъра, който да бъде прикачен към GameObject
  • Различни компоненти на UI Canvas за показване на GUI

Има още товари, но това са основните, с които ще трябва да се запознаете. Единият съвет е, че можете да получите достъп до всички документи за тях чрез ръководството за единство и препратка към скриптове офлайн, където и да сте:

Създаване на потребителски компоненти

Вградените компоненти контролират предимно физиката и визуалните елементи, но за да направите наистина игра, ще трябва да приемете потребителското въвеждане и да манипулирате тези стандартни компоненти, както и самите GameObjects.

За да започнете да създавате компоненти, отидете в желания GameObject> Добавяне на компонент> въведете името на новия си компонент в лентата за търсене> нов скрипт (c #).

Като обща препоръка бих препоръчал да не се използва Javascript в Unity. Не е актуализиран с всички страхотни неща, които идва с ES6, и повечето от по-напредналите разчитат на C # неща, пренесени в Javascript ... Това просто се превръща в едно гигантско решение около моя опит.

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

Основни функции

Всички компоненти се наследяват от MonoBehaviour Class. Той включва няколко стандартни метода, най-важното:

  • void Start (), който се извиква всеки път, когато обект, съдържащ скрипта, е създаден в сцената. Това е полезно по всяко време, когато искаме да извършим някакъв код за инициализация, напр. задайте екипировка на играч, след като те се появят в мач.
  • void Update (), който се нарича всеки кадър. Тук ще отиде по-голямата част от кода, включващ въвеждане от потребителя, като се актуализират различни свойства като движението на плейъра в сцената.

Променливи на инспектора

Често искаме да направим компонентите възможно най-гъвкави. Например всички оръжия могат да имат различни щети, скорострелност, has_sight и т.н. Докато всички оръжия са по същество едно и също нещо, ние може да искаме да можем да създадем различни вариации бързо чрез редактора на единството.

Друг пример, при който може да искаме да направим това, е когато създаваме UI компонент, който проследява движенията на потребителската мишка и поставя курсор в прозореца за гледане. Тук може да искаме да контролираме чувствителността на курсора към движения (ако потребителят използва джойстик или геймпад срещу компютърна мишка). По този начин би имало смисъл тези променливи да се променят лесно както в режим на редактиране, така и да се експериментира с тях по време на изпълнение.

Можем да направим това лесно, като просто ги декларираме като публични променливи в тялото на компонента.

Приемане на въведеното от потребителя

Разбира се, ние искаме нашата игра да реагира на потребителския вход. Най-често срещаните начини за това са следните методи във функцията Update () на компонент (или където и да е друго, което искате):

  • Input.GetKey (KeyCode.W) Връща True W бутонът се задържа
  • Input.GetKeyDown (KeyCode.W) Връща True при първо натискане на клавиша W
  • Input.GetAxis („Вертикален“), Input.GetAxis („Хоризонтален“) Връща между -1,1 движение на входа на мишката

Манипулиране на GameObjects

След като въведем потребител, искаме GameObjects в нашата сцена да реагират. Има няколко вида отговори, които можем да разгледаме:

  • Превод, завъртане, мащаб
  • Създайте нови GameObjects
  • Изпращане на съобщения до съществуващи GameObjects / компоненти

Трансформации

Всички GameObjects имат свойство за преобразуване, което позволява извършването на различни полезни манипулации върху текущия обект на играта.

Горните методи са доста обясними , просто имайте предвид, че ние използваме малки букви gameObject, за да се позовем на GameObject, който притежава този конкретен екземпляр на компонента.

Като цяло е добра практика да се използва локално [Position, Rotation], а не глобалното положение / завъртане на обект. Това обикновено улеснява преместването на обекти по разумен начин, тъй като оста на локалното пространство ще бъде ориентирана и центрирана върху родителския обект, а не върху световния произход и x, y, z посоките.

Ако трябва да конвертирате между локално и световно пространство (което често се случва), можете да използвате следното:

Както можете да си представите, зад това има доста проста линейна алгебра, намекната от „Inverse“ в името на метода.

Създаване на нови GameObjects

Тъй като GameObjects са основно всичко във вашата сцена, може да искате да можете да ги генерирате в движение. Например, ако вашият плейър има някакъв стартер за снаряди, може да искате да можете да създавате снаряди в движение, които имат своя собствена капсулирана логика за полет, нанасяне на щети и т.н. ...

Първо трябва да въведем понятието сглобяема конструкция . Можем да ги създадем, просто като плъзнем който и да е GameObject в йерархията на сцената в папката с активи.

Това по същество съхранява шаблон на обекта, който току-що имахме в нашата сцена, със същите конфигурации.

След като разполагаме с тези сглобяеми компоненти, можем да ги присвоим на инспекторски променливи (както говорихме по-рано) на всеки компонент в сцената, така че да можем да създаваме нови GameObjects, както е посочено от сглобяемата по всяко време.

След това можем да извършим „екземпляр“ на сглобката и да я манипулираме до желаното място в сцената и да установим необходимите родителски взаимоотношения.

Достъп до други GameObjects и компоненти

Често трябва да комуникираме с други GameObjects, както и свързаните с тях компоненти. След като имате препратка към обект на игра, това е доста просто.

ComponentName comp = some_game_object.GetComponent ();

След това можете да получите достъп до някой от публичните методи / променливи на компонента, за да манипулирате GameObject. Това е ясен бит, но всъщност получаването на препратка към GameObject може да стане по няколко начина ...

Достъп чрез инспекторска променлива

Това е най-директното. Просто създайте публична променлива за GameObject, както демонстрирахме по-рано с предварителните модули, и ръчно я плъзнете и пуснете върху компонента чрез инспектора. След това отворете променливата, както по-горе.

Достъп чрез маркиране

Можем да маркираме GameObjects или сглобяеми елементи чрез инспектора и след това да използваме функциите за търсене на игрален обект, за да намерим препратки към тях.

Това просто се прави по-долу.

GameObject some_game_object = GameObject.FindGameObjectWithTag (“Тухла”);

Достъп чрез трансформация

Ако искаме да осъществим достъп до компоненти в някакъв родителски обект, можем лесно да направим това чрез атрибута transform.

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

Достъп чрез SendMessage

Като алтернатива, ако искаме да изпратим съобщение до много други компоненти или желаем да изпратим съобщение на обект, който е далеч нагоре вложена йерархия, можем да използваме функциите за изпращане на съобщения, които приемат името на функцията, последвано от аргументите.

gameObject.SendMessage (“MethodName”, параметри); // Излъчване на messagegameObject.SendMessageUpwards (“MethodName”, параметри); // Получава се само от компоненти, които са вложени по-горе.

Raycasting

Може би сте чували за това и преди, когато хората сравняват FPS игри, които са „базирани на физика“ или „базирани на лъчи“. Raycasting по същество прилича на наличието на лазерен показалец, който, когато влезе в контакт с „ударник“ или „твърдо тяло“, той връща „удар“ и връща обратно детайлите на обекта.

Има два сценария, при които това е полезно (вероятно има още много):

  1. Ако сте проектирали оръжейна система за игра, бихте могли да използвате лъчеви излъчвания за откриване на удари и дори да персонализирате дължината на лъча, така че мелевите предмети да се „удрят“ само на къси разстояния
  2. Създайте лъч от показалеца на мишката до точка в 3D пространство, т.е. ако искате потребителят да може да избира единици с мишката в стратегическа игра.

Както можете да видите, кодът за това е малко по-ангажиран. Ключовото нещо, което трябва да разберете, е, че за да хвърлите лъч към мястото, където мишката сочи в триизмерното пространство, е необходима трансформацията на ScreenPointToRay. Причината за това е, че камерата изобразява 3D пространство като 2d прозорец на екрана на вашия лаптоп, така че естествено има включена проекция за прехвърляне обратно в 3d.

Откриване на сблъсък

По-рано споменахме компонентите Collider и Rigidbody, които могат да бъдат добавени към обект. Правилото за сблъсъците е, че единият обект при сблъсъка трябва да има твърдо тяло, а другият - ударник (или и двата имат двата компонента). Имайте предвид, че когато се използва лъчево излъчване, лъчите ще взаимодействат само с обекти с прикрепени компоненти на колайдера.

След като настроите всеки персонализиран компонент, прикрепен към обекта, можем да използваме методите OnCollisionEnter, OnCollisionStay и OnCollisionExit, за да отговорим на сблъсъци. След като получим информацията за сблъсъка, можем да накараме GameObject да отговори и да използваме наученото по-рано, за да взаимодействаме и с прикачени към него компоненти.

Едно нещо, което трябва да се отбележи е, че твърдите тела осигуряват физика като гравитацията на обектите, така че ако искате това да е изключено, ще трябва да проверите is_kinematic .

Разширени функции

Няма да навлизаме в нищо от това сега, но може би в бъдеща статия - само за да ви уведомим, че те съществуват.

Създаване на GUI

Unity разполага с пълноценен потребителски интерфейс за изготвяне на GUI за вашата игра. Като цяло тези компоненти работят доста подобно на останалата част от двигателя.

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

Unity ви позволява да добавяте персонализирани бутони към вашите инспектори, така че да можете да повлияете на света по време на режим на редактиране. Например, за да помогнете за изграждането на света, можете да разработите персонализиран прозорец с инструменти за изграждане на модулни къщи.

Анимация

Unity разполага със система за анимация, базирана на графики, която ви позволява да смесвате и контролирате анимации върху различни обекти, като например играчи, прилагащи костна анимационна система.

Материали и PBR

Unity работи с физически базиран двигател за рендиране, който позволява осветление в реално време и реалистични материали. Реалността е, че или ще трябва първо да научите 3d моделиране, или да използвате модели, направени и оптимизирани от някой друг, преди да стигнете до това, за да направите неща, които всъщност изглеждат добре.

Съвети за новодошлите

Ако планирате да напишете първата си игра, не подценявайте сложността и времето, необходимо за написването дори на най-тривиалните игри. Не забравяйте, че повечето игри, които излизат в Steam, имат екипи, които работят по тях години наред!

Изберете проста концепция и я разбийте на малки постижими етапи. Силно се препоръчва да разделите играта си на възможно най-малки независими компоненти, тъй като е много по-малко вероятно да срещнете грешки, ако държите компонентите прости, а не монолитни кодови блокове.

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

Приятни ресурси и общности

Дизайнът на игрите има една от най-добрите общности от всички там и има много висококвалифицирани професионалисти в индустрията, които предлагат съдържание безплатно или почти нищо. Това е поле, което изисква 3D моделисти, концептуални художници, дизайнери на игри, програмисти и така нататък. Свързах някои страхотни общи ресурси, които срещнах за всяко от тези полета по-долу:

Концепция Изкуство

  • Училище за дизайн Feng Zhu (над 90 часа уроци по концептуално изкуство)
  • Тайлър Едлин Арт (страхотна общност на BST с отзиви от професионалисти относно ежемесечните предизвикателства)
  • Art Cafe (Интервюта и семинари с известни концептуални артисти)
  • Трент Каниуга (Илюстратор и 2D художник, който също прави собствена игра)

3D моделиране

  • CG бисквитка (Най-добри основи за моделиране на мрежи в Blender Ever, те имат много друго отлично съдържание за блендер)
  • Tor Frick (Моделисти и скулптори с твърда повърхност в Blender)
  • Глеб Александров (кратки мощни уроци за рендиране в Blender)

Дизайн на игри

  • DoubleFine Amnesia Fortnight (GameDevs, които правят двуседмичен хакатон и записват целия си процес на проектиране)
  • GameMakers Toolkit (разглежда принципите на игровия дизайн)

Програмиране

  • Ръчно изработен герой (Написване на игра и двигател от нулата в C)
  • Джонатан Блоу (разработчик на Indie, който предава на живо развитието на играта си)
  • Brackeys (уроци по Nice Unity)

Заключение

Надявам се, че този урок сте харесали! Правя малко графичен дизайн, както и прототипи на игри и потребителски интерфейс, така че разгледайте портфолиото ми ! Аз също съм свързан в .

Портфолио| LinkedIn