Мазмуну:

Arduino контроллери менен көп оюнчу оюнун кантип жасоо керек: 6 кадам
Arduino контроллери менен көп оюнчу оюнун кантип жасоо керек: 6 кадам

Video: Arduino контроллери менен көп оюнчу оюнун кантип жасоо керек: 6 кадам

Video: Arduino контроллери менен көп оюнчу оюнун кантип жасоо керек: 6 кадам
Video: How to user Makerfabs ESP32 3.5" TFT Capacitive Touch with Camera 2024, Ноябрь
Anonim
Arduino контроллери менен кантип көп оюнчу оюнун жасаса болот
Arduino контроллери менен кантип көп оюнчу оюнун жасаса болот

Оюн иштеп чыгуучулар дүйнө жүзүндөгү адамдар ойногонду жактырган укмуштуудай оюндарды кантип жаратаарын ойлонуп көрдүңүз беле? Ооба, бүгүн мен сизге кичинекей көп оюнчу оюнун жасап, аны сиз жасай турган Arduino контроллери башкарат. Ошентип, келгиле, баштайлы.

Жабдуулар

Сага керек болот:

  • Ноутбук
  • Биримдик Engine
  • Биримдик менен иштеген C# IDE, мисалы визуалдык студия же Atom. (Мен Visual Studio кодун колдоном)
  • 2X Arduino Nano
  • 2X Big Bread Board
  • 2X Small Bread Board
  • 4X Tack Switch (баскыч)
  • 4X 200Ω резистор
  • 12X Эркек - Эркек Jumper Wires
  • Arduino IDE

Биримдикти колдонуу боюнча негизги түшүнүгүңүз бар болсо, бул пайдалуу болот, бирок бул сиздин прогресске эч кандай таасирин тийгизбейт, анткени сиз оюнду улантууда аны менен таанышасыз.

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 долбоорун ачып, атын атап, 2D оюнун тандаңыз.

Долбоор ачылганда, 3 негизги бөлүм деп аталганын байкаңыз

  • Иерархия (бул жерде сиздин бардык оюн объекттериңиз жана деталдарыңыз кошулат).
  • Сахна (оюндун көрүнүшүн орноткон жерде).
  • Оюн (бул жерде чыныгы оюн кандай болорун текшере аласыз).

Байкаңыз, иерархиянын астында сиздин сахна жана сахнанын астында "Башкы камера" бар. Камераны иерархиядан тандасаңыз, ал сахнада тандалат

(Бул камеранын чегиндеги нерсе реалдуу оюнда көрсөтүлөт).

1 -сүрөттү караңыз

Биздин оюн эки доскадан, ары -бери кыймылдаган топтон жана тактайлар менен топтун кыймылын чектеген чектерден турат.

Чек араларды түзүүдөн баштайлы.

  1. Жаңы оюн объектисин түзүү үчүн Активдер> Түзүү> Спрайттар> квадратты тандаңыз ("оң жана сол чектери" деп атаңыз) 2 -сүрөттү караңыз
  2. Оң жана сол чектерди иерархияга сүйрөп таштаңыз жана сахнада квадрат пайда болот.
  3. Анын х огунун абалын тууралаңыз (5) "оң жана сол чектер"> инспектор> трансформация> позиция> X. 3 -сүрөттү караңыз
  4. Андан кийин анын масштабын камеранын чектерин жаба тургандай кылып тууралаңыз (аны сунуу үчүн аянттын үстүнкү жана астыңкы жактарын сүйрөңүз).
  5. Анын түсүн "оң жана сол чектерден"> инспектор> спрайт рендер> түсүн тууралаңыз. 3 -сүрөттү караңыз
  6. Инспектордо ылдый жылып, компонент кошууну тандап, андан кийин Rigidbody2D терип, enter баскычын басыңыз, бул негизинен оюн объектиңизге физика кошот, анткени ал массаны, тартылуу күчүн жана кагылышууну аныктайт. Бирок, биздин оюнда гравитациянын кереги жок, андыктан гравитацияны 0 кылыңыз. Ошондой эле, сиз кагылышканда чек ара жылбай тургандай абалды жана айланууну тоңдурушуңуз керек болот. 4 -сүрөттү караңыз
  7. кошуу компонентин тандап, андан кийин Box Collider 2D терип, Enter баскычын басыңыз, бул оюн объектисинин айланасында кагылышууларды аныктоого болот. 4 -сүрөттү караңыз
  8. Эми оң жана сол чектерди тандап, кайталоо үчүн (ctrl+d) басыңыз.
  9. Аны "сол чек" деп атагыла жана биринчисин ("оң чек") деп атагыла.
  10. Сол чекти тандап, анын х огунун абалын (-5) 3-кадамда дал ушундай кылып тууралаңыз. Эми сизде оң жана сол чектер бар.

Мурунку 10 кадамды өйдө жана ылдый чек менен кайталаңыз жана х позициясынын ордуна квадраттын y абалын өзгөртүңүз. Акыркы кароо сүрөттөгүдөй болушу керек.

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 мурунтан эле ошол жерде болот.
  • A Rigidbody 2D мурунтан эле ошол жерде болот жана y жана z огу мурунтан эле тоңуп калат.

1 -сүрөттү караңыз

Контроллерлерди жасоо

Сага керек болот:

  • 2X Arduino Nano
  • 2X Big Bread Board
  • 2X Small Bread Board
  • 4X Tack Switch (баскыч)
  • 4X резистор
  • 12X Эркек - Эркек Jumper Wires

Эми нан тактасынын сүрөттөрүн жана джойстиктерди чогултуу үчүн картасын караңыз.

  1. Кичинекей нан тактасы менен бир Arduino Nano чипин тиркеңиз.
  2. Сүрөттө көрсөтүлгөндөй, чоң нан тактасына 2 Tack өчүргүчтөрүн тиркеңиз. Нан тактасынын оң жагын сол колуңузга симметриялуу кармоого аракет кылыңыз, анткени бул джойстикти жакшыраак кылат (Сиз 30 -мамычаны симметрия катары колдонсоңуз болот) сызык)
  3. Сол баскычтын жогорку сол жагындагы пинди кичинекей нан тактасындагы Arduinoдогу 5V төөнөгүч менен туташтырыңыз (ошол эле тилке менен байланышкан нерселер бири-бирине туташкан).
  4. Оң баскычтын жогорку оң жагындагы пинди Arduinoдогу 5V пин менен туташтырыңыз.
  5. Каршылашты колдонуп, сол баскычтын ылдыйкы оң жагындагы пинди 31-мамычанын чекити менен туташтырыңыз.
  6. Оң баскычтын ылдыйкы-сол жагындагы пинди 29-колоннанын чекити менен резистор аркылуу туташтырыңыз.
  7. Резисторлорду Arduinoдогу GND пини менен туташтырыңыз.
  8. Сол баскычтын жогорку оң жагындагы пинди Arduinoдогу D3 пин менен туташтырыңыз.
  9. Оң баскычтын жогорку сол жагындагы пинди Arduinoдогу D9 пин менен туташтырыңыз.
  10. Эми бул кадамдарды кайталап, экинчи контролер кылыңыз.

3 -кадам: Arduino -ны Сериялык портко туташтыруу

Arduino сериялык портуна туташуу
Arduino сериялык портуна туташуу
Arduino сериялык портуна туташуу
Arduino сериялык портуна туташуу
Arduino сериялык портуна туташуу
Arduino сериялык портуна туташуу
Arduino сериялык портуна туташуу
Arduino сериялык портуна туташуу

Биринчиден, сиз Arduino IDE орнотушуңуз керек.

Алар орнотулгандан кийин, сиз баскычтардан кирүүлөрдү кабыл алган Arduino программасын жасап, аларды Сериялык портко (COM порту) сактай аласыз. Ардуино тактасы ноутбугуңузга туташканда, операциялык система тактаны автоматтык түрдө сериялык порт катары тааныйт, ага программаларды жүктөөгө болот. Сериялык портто сакталган баалуулуктар Unity Engineди сериялык порт менен туташтырганда кийинки кадамда колдонулушу мүмкүн.

Эми Arduino менен Serial портуна туташалы.

Сүрөттөрдү караңыз

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

Код:

жараксыз орнотуу () {

Serial.begin (9600); pinMode (3, INPUT); // Arduinoго D3 pinMode пин (9, INPUT) кирүүсүн алуу үчүн айтуу; // Ардуиного D9 пинден кирүүнү алууну айтуу} void loop () {if (digitalRead (3) == 1) { /* Эгерде Arduino 1 Serial.write (1) киришин алса; 3 -пинден Serial.flush () сериялык портуна 1 маанисин чыгарыңыз; */ кечиктирүү (2); } if (digitalRead (9) == 1) { /* Эгерде Arduino 1 Serial.write (2) киришин алса; pin 9дан Serial.flush () сериялык портуна 2 маанисин чыгарыңыз; */ кечиктирүү (2); }}

Программанын түшүндүрмөсү:

Бул код жөн гана баскычтарга туташкан Arduinoдогу D3 жана D9 пиндеринен маалыматты алат. Баскычтар басылат же басылбайт, демек алардан алынган көрсөткүчтөр 1 (басылган) же 0 (басылбаган). Эгерде оң баскычтан (D9дан) кириш 1 болсо (басылган) Сериялык портко 1 маанисин сактап коюңуз. Эгерде сол баскычтан кирүү (D3төн) 1 болсо (басылган) Сериялык портто 2 маанисин сактаңыз.

4 -кадам: Биримдикти Сериялык Порт менен Туташтыруу

Сериялык порт менен биримдикти туташтыруу
Сериялык порт менен биримдикти туташтыруу
Сериялык порт менен биримдикти туташтыруу
Сериялык порт менен биримдикти туташтыруу

Бул кадам үчүн биз Unity'деги сериялык портту аныктайбыз, ошондо ал баскычтар басылганда Arduino'дон кирүүлөрдү алат. Ноутбугуңузга Visual Studio Code орнотуңуз. Андан кийин Биримдикке барып, иерархиядан 1 -оюнчуну тандап, ылдый жылдырып, компонент кошууну тандап, player1_motion териңиз, андан кийин enter басыңыз. 1 -сүрөттү караңыз

Инспектордо C# скрипти түзүлөт, аны оң баскыч менен чыкылдатып, түзөтүү скриптин тандаңыз, визуалдык студиянын коду ачылышы керек жана 2 -сүрөткө окшош демейки кодду көрсөтөт.

Төмөнкү кодду көчүрүп, андан кийин "SerialPort sp = new SerialPort (" COM10 ", 9600) өзгөртүңүз;" менен SerialPort sp = жаңы SerialPort ("Сиздин Arduino туташкан COM порту", 9600); сиз аны Arduino кодуңузга кайтып, Куралдар> Порт> COM аркылуу таба аласыз (каалаган номер көрүнөт).

Код:

System. Collections колдонуу;

System. Collections. Generic колдонуу; UnityEngine колдонуу; System. IO. Ports колдонуу; public class player1_motion: MonoBehaviour {сүзүү ылдамдыгы = 8; жеке калкыма сумма SerialPort sp = жаңы SerialPort ("COM10", 9600); // Баштоо биринчи кадр жаңыртуусунан мурун чакырылат Start () {sp. Open (); sp. ReadTimeout = 1; } // Жаңыртуу кадрга бир жолу чакырылат void Update () {amounttomove = speed*0.01f; if (sp. IsOpen) {try {moveObject (sp. ReadByte ()); басып чыгаруу (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 -оюнчу менен жасаңыз жана player1_motion ордуна 'компонентти кошуу' player2_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. Rigidbody 2D кошуп, Z огун гана тоңдуруңуз.
  6. Массаны 0.0001ге өзгөртүңүз
  7. Gravity Scale'ди 0го өзгөртүңүз.
  8. Box Collider 2D кошуу.
  9. Активдер> Түзүү> Физика материалына өтүңүз 2D 1 -сүрөттү караңыз
  10. атын "секирүү" деп өзгөртүү
  11. Инспектордон сүрүлүүнү нөлгө өзгөртүңүз
  12. Инспектордун босун 1ге өзгөртүңүз
  13. Rigidbody 2D> Material'ге "секирүүнү" сүйрөп барып таштаңыз 2 -сүрөттү караңыз
  14. Иерархиядан кайра "топту" тандап, компонентти кошуп, Ball_movement деп териңиз, андан кийин enter басыңыз.
  15. Сценарийди оң баскыч менен чыкылдатып, түзөтүү скриптин тандаңыз.
  16. Төмөндөгү кодду көчүрүп, аны куруу жана иштетүү үчүн F5 баскычын басыңыз.

Код:

System. Collections колдонуу;

System. Collections. Generic колдонуу; UnityEngine колдонуу; коомдук класс Ball_movement: MonoBehaviour {// Баштоо биринчи фреймди жаңыртуудан мурун чакырылат жеке калкыма күч = 2; void Start () {StartCoroutine (move ()); } IEnumerator move () {кайтаруу жаңы WaitForSeconds (2) кайтарат; GetComponent (). AddForce (жаңы Vector2 (1f, 0.5f)*0.02f*күчү); }}

Коддун түшүндүрмөсү

Бул код топту 45 ° бурчта кыймылдаткан бирдей чоңдуктагы X багыты менен Y багытына эки багытта ылдамдыкты берет. 8 -кадамда биз топко физикалык материалды коштук жана анын ийилчээктигин өзгөрттүк, бул оюн учурунда топтун кыймылын камсыздайт.

6 -кадам: Оюнду жыйынтыктоо

Оюнду жыйынтыктоо
Оюнду жыйынтыктоо
Оюнду жыйынтыктоо
Оюнду жыйынтыктоо
Оюнду жыйынтыктоо
Оюнду жыйынтыктоо
Оюнду жыйынтыктоо
Оюнду жыйынтыктоо

Эми биз жоготууну мүмкүн кылышыбыз керек, эгер сиз оюнду иштетсеңиз, анда топ 1 -оюнчу же 2 -оюнчу өткөндө, ал жөн эле чек арадан секирип кетээрин байкайсыз жана бул биздин оюнда бизге такыр керек эмес. Тескерисинче, биз топту өйдө же ылдый чек менен сүзүшкөндө жана топтун абалын баштапкы абалга келтирүү үчүн упай эсептеген эсептегич жасагыбыз келет.

  1. Топту иерархиядан Долбоорго сүйрөп барып таштаңыз, сиз кийинчерээк колдоно алуу үчүн топтун префабрын жасадыңыз.
  2. Иерархияны оң баскыч менен чыкылдатып, боштукту түзүү тандаңыз. бош Объект көрүнөт, аны топтун кайра аталышы деп өзгөртүп, позициясын топтун абалына окшош кылып өзгөртөт.
  3. Иерархияны оң баскыч менен чыкылдатып, UI >> Текстти тандаңыз. Тексттин холст менен коштолгонуна көңүл буруңуз, оюндагы тексттин орду биздин оюндун чектеринде эмес, кенептеги тексттин абалына жараша болот. (1 -сүрөттү караңыз).
  4. Тексттин ордун каалаган жериңизге өзгөртүңүз.
  5. Экинчи оюнчунун упайы үчүн 3 жана 4 -кадамдарды кайталаңыз.
  6. Биринчи текстти "Player 1 Score: 0" деп териңиз жана экинчи текстти "Player 2 Score: 0" деп териңиз. (2 -сүрөттү караңыз).
  7. P1wins деп аталган жогорку чекке скрипт түзүңүз жана төмөнкү кодду көчүрүңүз.

Код:

System. Collections колдонуу;

System. Collections. Generic колдонуу; UnityEngine колдонуу; UnityEngine. SceneManagement колдонуу; UnityEngine. UI колдонуу; public class p1wins: MonoBehaviour {public Text score; public Transform ball_respawn; коомдук GameObject топу; private int p1 = 0; // Баштоо биринчи кадр жаңыртуусунан мурун чакырылат void Start () {} // Жаңыртуу кадрга бир жолу чакырылат void Update () {score.text = "1 -оюнчу упайы:" + p1; } void OnCollisionEnter2D (Collision2D other) {if (other.gameObject.tag == "Ball") {Destroy (other.gameObject); p1 ++; Ыкчамдоо (доп, топтун жооп берүүчү позициясы, шардын жооп берүүчүсү). }}}

8. 1 -кадамдагы долбоордон топтун префабын Ball параметрине сүйрөп барып таштаңыз. (3 -сүрөттү караңыз)

9. Топту иерархиядан Ball-rerspawn параметрине кайра тирилтип сүйрөңүз. (3 -сүрөттү караңыз)

10. оюнчу 1 упайын иерархиядан Score параметрине сүйрөп барып таштоо. (3 -сүрөттү караңыз)

Коддун түшүндүрмөсү:

Топ жогорку чек менен сүзүшкөндө, биз 2 -кадамда тапшырган ball_respawn абалында кайра жок кылынат жана кайра тирилет иерархиядан кайра тирилет, бирок жылбайт. Ошондой эле топ жогорку чек менен кагылышканда p1 деп аталган 0го барабар болгон маани 1ге көбөйөт, бул маани текст катары көрсөтүлөт, ошондуктан топ жогорку чек менен кагылышканда 1 -оюнчунун упайы 1ге жогорулайт.

Эми төмөнкү чек ара үчүн 7, 8, 9 жана 10 -кадамдарды жасаңыз

7 -кадам үчүн p2wins деп аталган скрипт түзүңүз жана анын ордуна төмөнкү кодду көчүрүңүз.

10 -кадам үчүн, оюнчу 2 упайын иерархиядан Score параметрине сүйрөп барып таштаңыз.

Код:

System. Collections колдонуу;

System. Collections. Generic колдонуу; UnityEngine колдонуу; UnityEngine. SceneManagement колдонуу; UnityEngine. UI колдонуу; public class p2wins: MonoBehaviour {public Text score; public Transform ball_respawn; коомдук GameObject топу; private int p2 = 0; // Баштоо биринчи кадр жаңыртуусу алдында чакырылат void Start () {} // Жаңыртуу бир кадрга бир жолу чакырылат void Update () {score.text = "Player 2 Score:" + p2; } void OnCollisionEnter2D (Collision2D other) {if (other.gameObject.tag == "Ball") {Destroy (other.gameObject); p2 ++; Ыкчамдоо (топ, топтун жооп берүүчү позициясы, шардын жооп берүүчүсү). }}}

Сунушталууда: