Как да създадете основна игра за Android с Unity

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



Изисквания:

  • Единство
  • Добър текстов редактор като NotePad ++ (по избор, но се препоръчва)
  • Android SDK
Ако все още го нямате, трябва да започнете, като изтеглите и инсталирате Unity SDK, а също и Android SDK. Нуждаем се от Android SDK, за да можем да тестваме APK на играта в Android среда.

Стартирайте Unity и създайте нов проект. Направете го 2D проект.



Има няколко панела, с които да се запознаете - панелът Йерархия, който ще съдържа всички наши елементи на сцената (сцена = независимо от „нивото“, върху което работите в момента). След това има раздел Игра, който се използва за игра / тестване на играта ви, докато сте в редактора, а вдясно имате панел Инспектор, където ще редактирате различни неща като осветление, физика и т.н.



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



Плъзнете и пуснете вашия спрайт върху основния прозорец на сцената (най-големия прозорец) - той също ще се появи в панела Йерархия вляво.

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

Така че просто създайте нов квадратен „спрайт“ и го плъзнете и пуснете в прозореца на сцена, както направихте с вашия спрайт герой.



Сега трябва да инструктираме Unity да даде физика на нашия основен герой - щракнете върху вашия основен спрайт герой (той трябва да стане маркиран в синьо в прозореца Scene), след това в панела Inspector, потърсете „GameObjects“.

Кликнете върху „Добавяне на компонент> Физика 2D> RigidBody2D“. Това автоматично ще добави физика към вашия спрайт, което иначе би трябвало да скриптирате в друг SDK.

Искаме да попречим на главния спрайт да се върти извън контрол - затова намерете раздела Ограничения в панела Инспектор (като основният спрайт все още е маркиран в прозореца Сцена) и поставете отметка в квадратчето за „Замразяване на завъртането Z“.

Ако натиснете бутона „Възпроизвеждане“, вашият основен спрайт герой трябва да падне от небето и просто да пада безкрайно - ще се погрижим за това по-късно, но просто обърнете внимание как лесно успяхме да приложим физиката. Физиката, която приложихме, зависи от формата, към която се прилага - така че ако приложите същата физика например върху сфера, тя ще се върти наоколо.

Също така искаме да коригираме ориентацията си, за да предотвратим въртенето и свободния ход на героя. Намерете ‘ограничения’ в инспектора с избран плейър и поставете отметка в квадратчето, за да замразите въртенето Z. Сега щракнете отново върху игра и трябва да откриете, че вашият играч сега пада от небето до безкрайната му гибел.

За да спрем основния си спрайт герой просто да пада безкрайно, ще трябва да добавим ускорител. Това по същество е само твърдото очертание на фигура, което ще добавим към основния спрайт. Маркирайте основния си спрайт герой, щракнете върху „Добавяне на компонент> Физика 2D> BoxCollider2D.

Сега направете същото с платформата, която сте създали по-рано. Вашият основен спрайт герой сега трябва да се 'сблъска' с платформата и да остане там.

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

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

Сега отидете в панела Йерархия и в списъка на GameObjects искате да плъзнете камерата отдолу основният спрайт герой (Player GameObject). Това ще направи основния спрайт герой „ родител на камерата. Така че, когато Player GameObject се движи по екрана, камерата трябва да го следва.

Така че за този урок за игра, ние просто ще създадем основна безкрайна игра тип бегач, нещо като Изпълнете 3 , където вашият главен герой ще тича през екрана и ще избягва препятствия (или „играта свърши“, ако ударите препятствие.) Това ще отнеме няколко скрипта, повечето от които ще бъдат предоставени в това ръководство.

Щракнете с десния бутон върху папката „Активи“ и създайте нова папка - дайте й име Скриптове . Сега щракнете с десния бутон върху тази нова папка и натиснете „Create> C # Script“ и го наименувайте PlayerControls . Този скрипт ще определи поведението на нашия основен спрайт герой.

Когато кликнете два пъти върху този нов скрипт, той Трябва отворете в Visual Studio - алтернативно (и моите лични предпочитания), можете да го редактирате в нещо като NotePad ++.

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

Над реда void Start ():

публично Rigidbody2D rb;

Следващият бит код, който трябва да добавим, ще отиде в рамките на Start () и се използва за намиране на неподвижното тяло - основно, ние инструктираме Unity да намери физиката, която сме прикачили към GameObjects (основният ни спрайт герой), и Start () ще бъде изпълнено, когато се създаде нов обект или скрипт.

След това намерете физическия обект.

rb = GetComponent< Rigidbody2D > ();

И ще добавите този ред вътре в Update ()

rb.velocity = ново Vector2 (3, rb.velocity.y);

Това, което Update () прави, е постоянно опресняване, така че всеки добавен там код ще работи непрекъснато (освен ако обектът не бъде унищожен). Така че това, което сме направили, е да инструктираме скрипта, че искаме твърдото тяло да има нов вектор, използвайки същата скорост по оста Y (rb.velocity.y), но със скорост 3 по хоризонталната ос. В бъдеще можете да използвате и „ FixedUpdate () ’ което е подобно, но различно, защото там можете да контролирате количеството актуализация / опресняване на скрипта.

Запазете скрипта и се върнете в Unity, след което щракнете върху основния си спрайт герой, за да го маркирате. В панела Inspector отидете на Add Component> Scripts и добавете скрипта, който току-що запазихме. Сега, когато щракнете върху бутона Възпроизвеждане, основният спрайт герой трябва непрекъснато да се движи към ръба на платформата.

Създаване на контроли за вход на играч

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

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

 ако (Input.GetMouseButtonDown (0)) {rb.velocity = ново Vector2 (rb.velocity.x, 5); }

Ще поставите това в метода Update () и това, което всъщност прави, е да каже на Unity, че когато играчът щракне върху бутона на мишката (което ще бъде преведено като натискане на екрана на Android), основният спрайт герой ще „скочи ' във въздуха. Това е така, защото сме добавили скорост по оста Y със стойност 5 (по-висока стойност би означавала по-висок скок, разбира се).

Ако не сте твърде запознати с кодирането, използвахме Ако изявление, защото Ако е по същество вид инструкция „направи или не“ - буквално се казва АКО това се случи, направете тази команда . Така че, ако играчът не щраква с мишката (или не докосва екрана на Android), тогава очевидно скриптът няма да се изпълни.

Продължете и кликнете върху бутона „Пусни“ и се уверете, че работи правилно, преди да продължите.

След това ще добавим нашите препятствия (които могат да „унищожат“ спрайта на главния герой), резултат от играта и меню „game over“.

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

В скрипта добавете този бит код по-горе методът Update ():

 публично Трансформиране на groundCheck; публично Трансформиране startPosition; публично   плувка groundCheckRadius; публично LayerMask whatIsGround; частни   bool на земята; И след това добавете този следващ ред към метода за актуализиране над ако изявление: onGround = Physics2D.OverlapCircle (groundCheck.position, groundCheckRadius, whatIsGround); И след това ще промените този следващ ред, за да включите „&& onGround“ ако (Input.GetMouseButtonDown (0) && onGround) {Така че целият ни скрипт по същество трябва да изглежда така: публично   клас   PlayerControls : MonoBehaviour { публично Rigidbody2D rb; публично Трансформиране на groundCheck; публично Трансформиране startPosition; публично   плувка groundCheckRadius; публично LayerMask whatIsGround; частни   bool на земята; нищожен   Започнете () {rb = GetComponent (); } нищожен   Актуализиране () {rb.velocity = ново Vector2 (3, rb.velocity.y); onGround = Physics2D.OverlapCircle (groundCheck.position, groundCheckRadius, whatIsGround); ако (Input.GetMouseButtonDown (0) && onGround) {rb.velocity = ново Vector2 (rb.velocity.x, 5); }}}

За да обясним какво сме направили, ние създадохме нова „трансформация“, което означава позиция в пространството на света на играта. Задали сме неговия радиус и инструктираме Unity да провери дали радиусът се припокрива с нашия слой „земя“ - и така, ако радиусът ни се синхронизира с „земята“, нашият герой трябва да може да скача и ако ние Вече сме във въздуха от скок, не бива да можем да скачаме отново. По принцип, на земята ще бъде вярно ако трансформираното име groundCheck се припокрива със земния слой. Дано това има смисъл.

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

Сега щракнете с десния бутон върху йерархията и създайте нов празен обект и го плъзнете така, че под неговия основен герой в основния прозорец на сцена - да позиционирате този празен обект там, където искаме да бъде открит подът. Преименувайте обекта на „Check Ground“ и след това го плъзнете под игралния обект на играча, както направихме по-рано с камерата (за да създадете връзка между родител и дете между обектите). Сега празният обект ще последва спрайта на главния герой, точно както камерата, и непрекъснато ще проверява етажната дистанция. Камера

Сега изберете главния спрайт и отидете на панела Inspector - плъзнете обекта Check Ground в пространството, наречено “groundCheck”. Позицията ‘преобразуване’ трябва да бъде равна на позицията на този нов обект и където пише „Радиус“, направете го 0,1.

Трябва да дефинираме приземния слой. Просто изберете земния терен и в Инспектора намерете бутона за „Layer: Default“ (това е падащо поле) и изберете „Add Layer“.

Сега изберете “ground” като слой за нашата платформа и повторете това за всички други платформи в прозореца на играта. Там, където пише „Какво е земята“ върху нашия основен обект за спрайт, изберете и основния слой.

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

Играта приключи при сблъсък и меню за игри

И така, за да приключим всичко, последните неща, които искаме да направим, са A: Направете сблъсък с препятствия в резултат на завършена игра и B: Създайте екран на менюто „game over“ с бутон за възпроизвеждане отново.

Това, което основно искате да направите, е:

  1. Добави Играч обект и задайте a твърдо тяло и а ускорител по ваш избор към него.
  2. Добавете Враг обект и задайте a твърдо тяло и а ускорител по ваш избор. (и по избор добавете Етикет „Враг“ към него)
  3. Създайте нов C # скрипт и го добавете като компонент към Играч (или използвайте който и да е скрипт, прикачен към плейъра, няма нужда да създавате нов, ако вече имате такъв)
  4. Добавете това във вашия скрипт:
нищожен OnCollisionEnter ( Сблъсък coll) { Отстраняване на грешки . Влезте („Сблъсък“); // Проверете дали дори регистрира сблъсък, ако работи, можете да премахнете този ред if (coll.gameobject. етикет == 'Враг') { // вижда дали обектът, с който играчът ви се е сблъскал, има етикет, наречен „Enemy