Съдържание:

Как да направите мултиплейър игра с Arduino контролери: 6 стъпки
Как да направите мултиплейър игра с Arduino контролери: 6 стъпки

Видео: Как да направите мултиплейър игра с Arduino контролери: 6 стъпки

Видео: Как да направите мултиплейър игра с Arduino контролери: 6 стъпки
Видео: Control 32 Servo over Wi-Fi using ESP32 and PCA9685 via desktop or mobile phone V5 2024, Юли
Anonim
Как да си направим мултиплейър игра с Arduino контролери
Как да си направим мултиплейър игра с Arduino контролери

Замисляли ли сте се как разработчиците на игри създават невероятни игри, в които хората с удоволствие играят? Е, днес ще ви дам само малък намек за това, като направя малка мултиплейър игра, която ще се контролира или от Arduino контролер, който също ще направите. Така че, нека започнем.

Консумативи

Ще имаш нужда:

  • Лаптоп
  • Unity Engine
  • C# IDE, която работи с Unity като визуално студио или Atom. (Ще използвам Visual Studio Code)
  • 2X Arduino Nano
  • 2X Big Bread Board
  • 2X малка дъска за хляб
  • 4X превключвател за захващане (бутон)
  • 4X 200Ω резистор
  • 12X мъжки джъмперни проводници
  • Arduino IDE

Ще бъде полезно, ако имате основни познания за използването на Unity, но няма да повлияе на напредъка ви, тъй като ще се запознаете с него, докато продължавате да правите играта.

Връзка за изтегляне на Unity Engine:

store.unity.com/download-nuo

Връзка за изтегляне на Visual Studio Code IDE:

code.visualstudio.com/download

Връзка за изтегляне на Arduino IDE:

www.arduino.cc/en/Main/Software

Стъпка 1: Настройте границите на играта

Настройте границите на играта
Настройте границите на играта
Настройте границите на играта
Настройте границите на играта
Настройте границите на играта
Настройте границите на играта

На първо място, трябва да изтеглите Unity

След като това стане, можете да започнете да настройвате изгледа на играта си.

Отворете нов проект на Unity, дайте му име и изберете 2D игра.

Когато проектът се отвори, забележете, че има 3 основни раздела

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

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

(Всичко в границите на тази камера ще се покаже в реалната игра).

Вижте снимка 1

Нашата игра се състои от две дъски, топка, която се движи, и граници, които ограничават движението на дъските и топката.

Нека започнем със създаването на граници.

  1. За да създадете нов игрален обект, изберете Активи> Създаване> Спрайтове> квадрат (наречете го „дясна и лява граница“) Погледнете снимка 2
  2. Плъзгане и пускане на дясната и лявата граница към йерархията и квадрат ще се появи в сцената.
  3. Регулирайте позицията на оста x на (5) „дясна и лява граница“> инспектор> преобразуване> позиция> X. Вижте снимка 3
  4. След това регулирайте мащаба му, така че да е достатъчно голям, за да покрие границите на камерата (плъзнете горната и долната страна на квадрата, за да го разтегнете).
  5. Регулирайте цвета му „от дясната и лявата граница“> инспектор> изобразяване на спрайт> цвят. Вижте снимка 3
  6. Превъртете надолу в инспектора и изберете добавяне на компонент, след това въведете Rigidbody2D и натиснете enter, това основно ще добави физика към вашия обект на игра, тъй като му дава маса, гравитация и сблъсък. Въпреки това, ние не се нуждаем от гравитация в нашата игра, затова направете гравитацията 0 вместо 1. Вие също ще трябва да замразите позицията и въртенето, така че границата да не се движи, когато се сблъска. Вижте снимка 4
  7. изберете добавяне на компонент, след това въведете Box Collider 2D и натиснете enter, това ще добави област около игровия обект, където могат да бъдат открити сблъсъци. Вижте снимка 4
  8. Сега изберете дясната и лявата граница и натиснете (ctrl+d), за да я дублирате.
  9. Преименувайте го на „лява граница“и преименувайте първата („дясна граница“).
  10. Изберете лявата граница и регулирайте нейната позиция x на (-5) по същия начин в стъпка 3. Сега имате дясна и лява граница.

Повторете предишните 10 стъпки с границите нагоре и надолу и променете позицията y на квадрата вместо позицията x. Финалната визуализация трябва да е нещо подобно на това на снимката.

Вижте снимка 5

Стъпка 2: Добавяне на платки и създаване на контролери

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

Добавяне на дъски

Направете нов игрален обект и го наречете играч 1.

Регулиране:

  • Мащаб: X (1.2), Y (0.15), Z (1)
  • Позиция: X (0), Y (-3.6), z (0)
  • Добавете BoxCollider2D
  • Добавете Rigidbody 2D и замразете осите y и z.

Дублирайте (ctrl+d) и преименувайте копиращия плейър 2.

Регулиране:

  • Мащаб: X (1.2), Y (0.15), Z (1)
  • Позиция: X (0), Y (3.6), z (0)
  • BoxCollider вече ще бъде там.
  • 2D с твърдо тяло вече ще бъде там, а осите y и z вече ще бъдат замразени.

Вижте снимка 1

Изработване на контролери

Ще имаш нужда:

  • 2X Arduino Nano
  • 2X Big Bread Board
  • 2X малка дъска за хляб
  • 4X превключвател за захващане (бутон)
  • 4X резистор
  • 12X джъмперни проводници от мъжки към мъжки

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

  1. Прикрепете един чип Arduino Nano с малка дъска за хляб.
  2. прикрепете 2 превключвателя Tack към голямата дъска за хляб, както е показано на снимката. Опитайте се да държите дясната страна на дъската за хляб симетрична спрямо лявата, тъй като това ще направи джойстика да изглежда по -добре (Можете да използвате 30 -та колона като симетрия ред)
  3. Свържете горния ляв щифт на левия бутон с 5V щифта в Arduino на малката дъска за хляб (нещата, които са свързани със същата колона в макета, са свързани помежду си).
  4. Свържете горния десен щифт на десния бутон с 5V щифта в Arduino.
  5. Свържете долния десен щифт на левия бутон с точка на 31-ва колона с помощта на резистор.
  6. Свържете долния ляв щифт на десния бутон с точка на 29-та колона с помощта на резистор.
  7. Свържете резисторите с щифта GND в Arduino.
  8. Свържете горния десен щифт на левия бутон с щифта D3 в Arduino.
  9. Свържете горния ляв щифт на десния бутон с щифта D9 в Arduino.
  10. Сега повторете тези стъпки и направете втория контролер.

Стъпка 3: Свързване на Arduino към серийния порт

Свързване на Arduino към серийния порт
Свързване на Arduino към серийния порт
Свързване на Arduino към серийния порт
Свързване на Arduino към серийния порт
Свързване на Arduino към серийния порт
Свързване на Arduino към серийния порт
Свързване на Arduino към серийния порт
Свързване на Arduino към серийния порт

Първо ще трябва да инсталирате Arduino IDE.

След като бъдат инсталирани, можете да започнете, като направите програма Arduino, която получава входове от бутоните и ги съхранява в сериен порт (COM порт). Когато към вашия лаптоп е свързана платка Arduino, операционната система автоматично разпознава платката като сериен порт, на който могат да се качват програми. Стойностите, съхранени в серийния порт, могат да бъдат използвани в следващата стъпка, когато свържем Unity Engine със серийния порт.

Сега нека свържем Arduino със серийния порт.

Погледни картинките

  1. Свържете Arduino с вашия лаптоп
  2. Инструменти> Табло> Arduino Nano
  3. Ако вашият чип Arduino е скорошен (2018-2020) Инструменти> Процесор> ATmega328P (Стар зареждащ механизъм).
  4. Ако чипът ви Arduino не е скорошен (преди 2018 г.) Инструменти> Процесор> ATmega328P
  5. Инструменти> Порт> COM (който и номер да се появи, в моя случай е 10). * Това е серийният порт, където ще се съхраняват стойностите.
  6. Копирайте кода и го поставете в IDE на Arduino и натиснете ctrl+u, за да качите програмата.
  7. Повторете с втория Arduino. (когато правите стъпка 5, не забравяйте да изберете друг COM порт, така че и двата контролера да не бъдат свързани към един и същ сериен порт).

Код:

void setup () {

Serial.begin (9600); pinMode (3, INPUT); // Казваме на Arduino да получава вход от пин D3 pinMode (9, INPUT); // Казваме на Arduino да получава вход от пин D9} void loop () {if (digitalRead (3) == 1) { /* Ако Arduino получава вход от 1 Serial.write (1); от извод 3 Изведете стойност 1 към серийния порт Serial.flush (); */ забавяне (2); } if (digitalRead (9) == 1) { /* Ако Arduino получава вход от 1 Serial.write (2); от извод 9 Изведете стойност 2 към серийния порт Serial.flush (); */ забавяне (2); }}

Обяснение на програмата:

Този код просто приема вход от щифта D3 и щифта D9 в Arduino, които са свързани с бутоните. Бутоните се натискат или не се натискат, което означава, че показанията, взети от тях, са или 1 (натиснат) или 0 (не натиснат). Ако входът от десния бутон (от D9) е 1 (натиснат), запазете стойност 1 в серийния порт. Ако входът от левия бутон (от D3) е 1 (натиснат), запазете стойност 2 в серийния порт.

Стъпка 4: Свързване на Unity със серийния порт

Свързване на Unity със серийния порт
Свързване на Unity със серийния порт
Свързване на Unity със серийния порт
Свързване на Unity със серийния порт

За тази стъпка ще идентифицираме серийния порт в Unity, така че да може да получава входовете от Arduino, когато бутоните са натиснати. Инсталирайте Visual Studio Code на вашия лаптоп. След това отидете на Unity, изберете плейър 1 от йерархията, превъртете надолу и изберете добавяне на компонент и въведете player1_motion, след което натиснете enter. Вижте снимка 1

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

Копирайте следния код, след което променете "SerialPort sp = нов SerialPort (" COM10 ", 9600);" със SerialPort sp = нов SerialPort ("COM порт, към който е свързан вашият Arduino", 9600); можете да го намерите, като се върнете към кода на Arduino и изберете Инструменти> Порт> COM (който и номер да се появи).

Код:

използване на System. Collections;

използване на System. Collections. Generic; използване на UnityEngine; използване на System. IO. Ports; обществен клас player1_motion: MonoBehaviour {скорост на плаване = 8; частно плаващо количество SerialPort sp = нов SerialPort ("COM10", 9600); // Старт се извиква преди първото обновяване на рамката void Start () {sp. Open (); sp. ReadTimeout = 1; } // Актуализацията се извиква веднъж на кадър void Update () {amounttomove = speed*0.01f; if (sp. IsOpen) {опитайте {moveObject (sp. ReadByte ()); print (sp. ReadByte ()); } catch (System. Exception) {}}} void moveObject (int Direction) {if (Direction == 1) {transform. Translate (Vector3.left*amounttomove, Space. World); } if (Посока == 2) {transform. Translate (Vector3.right*amounttomove, Space. World); }}}

Обяснение на кода:

Този код казва на единството да получава входове от серийния порт (COM 10). Когато левият бутон е натиснат, Arduino изпраща стойност 1 до серийния порт, ако единството получи 1 от серийния порт, към игралния обект „играч 1“се добавя скорост в лявата посока. При натискане на десния бутон Arduino изпраща стойност 2 на серийния порт, ако единството получава 2 от серийния порт, към обекта на игра „играч 1“се добавя скорост в правилната посока. ако серийният порт не получи стойност от серийния порт, не се добавя скорост в нито едната посока, следователно платката остава неподвижна.

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

Сега направете същите стъпки още веднъж, но с плейър 2 и не забравяйте да напишете „Добавяне на компонент“player2_motion вместо player1_motion и да идентифицирате втория COM порт, към който е свързан вторият контролер, а не същия сериен порт.

Също така ще трябва да промените „public class player1_motion: MonoBehaviour“на „public class player2_motion: MonoBehaviour“в самия код.

Стъпка 5: Добавяне на топката

Добавяне на топката
Добавяне на топката
Добавяне на топката
Добавяне на топката
Добавяне на топката
Добавяне на топката
  1. Добавете нов игрален обект, но този път изберете кръг вместо квадрат.
  2. Преименувайте го на „топка“.
  3. Плъзнете и пуснете в йерархията.
  4. Регулирайте скалата (X: 0,2 - Y: 0,2 - Z: 0,2).
  5. Добавете 2D твърдо тяло и замразете само оста Z.
  6. Променете масата на 0,0001
  7. Променете скалата на гравитацията на 0.
  8. Добавете Box Collider 2D.
  9. Отидете на Активи> Създаване> Физически материал 2D Вижте снимка 1
  10. променете името му на „отскачане“
  11. Променете триенето на нула от инспектора
  12. Променете bounciness на 1 от инспектора
  13. Плъзнете и пуснете „отскачане“в Rididbody 2D> Материал Вижте снимка 2
  14. Изберете отново „топката“от йерархията и отидете да добавите компонент и въведете Ball_movement, след което натиснете enter.
  15. Щракнете с десния бутон върху скрипта и изберете редактиране на скрипта.
  16. Копирайте кода по -долу и натиснете F5, за да го изградите и стартирате.

Код:

използване на System. Collections;

използване на System. Collections. Generic; използване на UnityEngine; публичен клас Ball_movement: MonoBehaviour {// Start се извиква преди първото обновяване на кадъра private float force = 2; void Start () {StartCoroutine (move ()); } IEnumerator move () {yield return new WaitForSeconds (2); GetComponent (). AddForce (нов Vector2 (1f, 0.5f)*0.02f*сила); }}

Обяснение на кода

Този код дава на топката скорост в двете посоки X и Y посоката със същата величина, което кара топката да се движи под ъгъл 45 °. В стъпка 8 добавихме физически материал към топката и променихме нейната подвижност, това поддържа движението на топката през играта.

Стъпка 6: Финализиране на играта

Финализиране на играта
Финализиране на играта
Финализиране на играта
Финализиране на играта
Финализиране на играта
Финализиране на играта
Финализиране на играта
Финализиране на играта

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

  1. Плъзнете и пуснете топката от Йерархията към Project. Направили сте префаб на топката, за да можете да я използвате по -късно.
  2. Щракнете с десния бутон върху йерархията и изберете Създаване на празно. ще се появи празен обект, преименувайте го на respawn на топка и променете позицията му, за да бъде същата като позицията на топката.
  3. Щракнете с десния бутон върху йерархията и изберете UI >> Text. Забележете, че текстът придружава платно, позицията на текста в играта зависи от позицията на текста в платното, а не в границите на нашата игра. (Вижте снимка 1).
  4. Променете позицията на текста там, където искате да бъде.
  5. Повторете стъпки 3 и 4 отново за резултата на втория играч.
  6. Въведете първия текст „Резултат на играч 1: 0“и въведете във втория текст „Резултат на играч 2: 0“. (Вижте снимка 2).
  7. Създайте скрипт в горната граница, наречен p1wins и копирайте следния код.

Код:

използване на System. Collections;

използване на System. Collections. Generic; използване на UnityEngine; използване на UnityEngine. SceneManagement; използване на UnityEngine. UI; публичен клас p1wins: MonoBehaviour {public Text score; публична трансформация ball_respawn; публична топка GameObject; private int p1 = 0; // Старт се извиква преди първата актуализация на кадъра void Start () {} // Актуализацията се извиква веднъж на кадър void Update () {score.text = "Резултат на играч 1:" + p1; } void OnCollisionEnter2D (Collision2D other) {if (other.gameObject.tag == "Ball") {Унищожи (other.gameObject); p1 ++; Instantiate (ball, ball_respawn.position, ball_respawn.rotation); }}}

8. Плъзнете и пуснете сглобяемата топка от проекта в стъпка 1 в параметъра Ball. (Вижте снимка 3)

9. Плъзнете и пуснете топката респаун от йерархията до параметъра Ball-rerspawn. (Вижте снимка 3)

10. плъзнете и пуснете играч 1 резултат от йерархията към параметъра Score. (Вижте снимка 3)

Обяснение на кода:

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

Сега направете стъпки 7, 8, 9 и 10 за долната граница

за стъпка 7 създайте скрипт, наречен p2wins и вместо това копирайте следния код.

за стъпка 10, плъзнете и пуснете играч 2 резултат от йерархията към параметъра Score.

Код:

използване на System. Collections;

използване на System. Collections. Generic; използване на UnityEngine; използване на UnityEngine. SceneManagement; използване на UnityEngine. UI; публичен клас p2wins: MonoBehaviour {обществен текст резултат; публична трансформация ball_respawn; публична топка GameObject; private int p2 = 0; // Старт се извиква преди първата актуализация на кадъра void Start () {} // Актуализацията се извиква веднъж на кадър void Update () {score.text = "Резултат на играча 2:" + p2; } void OnCollisionEnter2D (Collision2D other) {if (other.gameObject.tag == "Ball") {Унищожи (other.gameObject); p2 ++; Instantiate (ball, ball_respawn.position, ball_respawn.rotation); }}}

Препоръчано: