Turinys:

Kaip sukurti kelių žaidėjų žaidimą naudojant „Arduino“valdiklius: 6 žingsniai
Kaip sukurti kelių žaidėjų žaidimą naudojant „Arduino“valdiklius: 6 žingsniai

Video: Kaip sukurti kelių žaidėjų žaidimą naudojant „Arduino“valdiklius: 6 žingsniai

Video: Kaip sukurti kelių žaidėjų žaidimą naudojant „Arduino“valdiklius: 6 žingsniai
Video: Proliduota USB „Windows 8.1“ ir „Windows 10“ tvarkyklių problema išspręsta - „Robojax“ 2024, Liepa
Anonim
Kaip sukurti kelių žaidėjų žaidimą naudojant „Arduino“valdiklius
Kaip sukurti kelių žaidėjų žaidimą naudojant „Arduino“valdiklius

Ar kada susimąstėte, kaip žaidimų kūrėjai sukuria nuostabius žaidimus, kuriuos žaidžia žmonės visame pasaulyje? Na, šiandien aš jums duosiu tik nedidelę užuominą apie tai, sukurdamas nedidelį kelių žaidėjų žaidimą, kurį valdys „Arduino“valdiklis, kurį taip pat sukursite. Taigi, pradėkime.

Prekės

Jums reikės:

  • Nešiojamasis kompiuteris
  • „Unity“variklis
  • C# IDE, kuris veikia su „Unity“, pvz., „Visual studio“ar „Atom“. (Naudosiu „Visual Studio Code“)
  • 2X „Arduino Nano“
  • 2X didelė duonos lenta
  • 2X maža duonos lenta
  • 4X fiksavimo jungiklis (mygtukas)
  • 4X 200Ω rezistorius
  • 12X jungiamieji laidai nuo vyrų iki vyrų
  • „Arduino IDE“

Tai bus naudinga, jei turėsite pagrindinį supratimą apie „Unity“naudojimą, tačiau tai neturės įtakos jūsų pažangai, nes susipažinsite su tuo kurdami žaidimą.

Nuoroda, kaip atsisiųsti „Unity Engine“:

store.unity.com/download-nuo

„Visual Studio Code IDE“atsisiuntimo nuoroda:

code.visualstudio.com/download

Arduino IDE atsisiuntimo nuoroda:

www.arduino.cc/en/Main/Software

1 žingsnis: nustatykite žaidimo kraštus

Nustatykite žaidimo ribas
Nustatykite žaidimo ribas
Nustatykite žaidimo ribas
Nustatykite žaidimo ribas
Nustatykite žaidimo ribas
Nustatykite žaidimo ribas

Pirmiausia turite atsisiųsti „unity“

Kai tai bus padaryta, galite pradėti kurti žaidimo vaizdą.

Atidarykite naują „Unity“projektą, pavadinkite jį ir pasirinkite 2D žaidimą.

Atidarę projektą, atkreipkite dėmesį, kad yra 3 pagrindiniai skyriai, vadinami

  • Hierarchija (čia bus pridėti visi jūsų žaidimo objektai ir detalės).
  • Scena (kurioje nustatote žaidimo vaizdą).
  • Žaidimas (kuriame galite išbandyti, kaip seksis tikras žaidimas).

Atkreipkite dėmesį, kad pagal hierarchiją yra jūsų scena, o po scena - „Pagrindinė kamera“. Kai pasirinksite fotoaparatą iš hierarchijos, jis bus pasirinktas scenoje

(Viskas, kas yra šios kameros ribose, bus rodoma tikrame žaidime).

Pažvelkite į 1 paveikslą

Mūsų žaidimas susideda iš dviejų lentų, rutulio, kuris juda, ir sienų, ribojančių lentų ir rutulio judėjimą.

Pradėkime nuo sienų kūrimo.

  1. Norėdami sukurti naują žaidimo objektą, pasirinkite Turtai> Sukurti> Sprites> kvadratas (pavadinkite jį „dešinė ir kairė kraštinės“) Žiūrėkite 2 paveikslėlį
  2. Nuvilkite dešinę ir kairę kraštus į hierarchiją ir scenoje atsiras kvadratas.
  3. Nustatykite jo x ašies padėtį į (5) „dešinė ir kairė kraštinės“> inspektorius> transformavimas> padėtis> X. Pažvelkite į 3 paveikslą
  4. Tada sureguliuokite jo mastelį, kad jis būtų pakankamai didelis, kad padengtų fotoaparato kraštus (tempkite viršutinę ir apatinę kvadrato puses, kad ją ištemptumėte).
  5. Sureguliuokite jo spalvą „iš dešinės ir kairės sienų“> inspektorius> „Sprite Render“> spalva. Pažvelkite į 3 paveikslą
  6. Slinkite žemyn inspektoriuje ir pasirinkite pridėti komponentą, tada įveskite „Rigidbody2D“ir paspauskite „Enter“, tai iš esmės pridės fizikos prie jūsų žaidimo objekto, nes suteiks jam masę, gravitaciją ir susidūrimo aptikimą. Tačiau žaidime mums nereikia gravitacijos, todėl vietoj to padarykite gravitaciją 0. Taip pat turėsite užšaldyti padėtį ir sukimąsi, kad susidūrus kraštinė nejudėtų. Pažvelkite į 4 paveikslą
  7. pasirinkite pridėti komponentą, tada įveskite „Box Collider 2D“ir paspauskite „Enter“, kad aplink žaidimo objektą būtų pridėta sritis, kurioje galima aptikti susidūrimus. Pažvelkite į 4 paveikslą
  8. Dabar pasirinkite dešinę ir kairę kraštines ir paspauskite (ctrl+d), kad ją dubliuotumėte.
  9. Pervardykite jį į „kairę sieną“ir pirmąją („dešinė siena“).
  10. Pasirinkite kairę kraštinę ir sureguliuokite jos x ašies padėtį į (-5), atlikdami 3 veiksmą. Dabar turite dešinę ir kairę kraštines.

Pakartokite ankstesnius 10 žingsnių su aukštyn ir žemyn kraštinėmis ir pakeiskite kvadrato y padėtį, o ne x padėtį. Paskutinė peržiūra turėtų būti kažkas panašaus į nuotrauką.

Pažvelkite į 5 paveikslą

2 veiksmas: lentų pridėjimas ir valdiklių kūrimas

Lentų pridėjimas ir valdiklių gamyba
Lentų pridėjimas ir valdiklių gamyba
Lentų pridėjimas ir valdiklių gamyba
Lentų pridėjimas ir valdiklių gamyba
Lentų pridėjimas ir valdiklių gamyba
Lentų pridėjimas ir valdiklių gamyba

Lentų pridėjimas

Sukurkite naują žaidimo objektą ir pavadinkite jį žaidėju 1.

Koreguoti:

  • Mastelis: X (1.2), Y (0.15), Z (1)
  • Padėtis: X (0), Y (-3,6), z (0)
  • Pridėkite „BoxCollider2D“
  • Pridėkite „Rigidbody 2D“ir užšaldykite y ir z ašis.

Pasikartokite (ctrl+d) ir pervardykite kopijavimo grotuvą 2.

Koreguoti:

  • Mastelis: X (1.2), Y (0.15), Z (1)
  • Padėtis: X (0), Y (3.6), z (0)
  • „BoxCollider“jau bus ten.
  • „Rigidbody 2D“jau bus, o y ir z ašys jau bus užšaldytos.

Pažvelkite į 1 paveikslą

Kontrolierių gamyba

Jums reikės:

  • 2X „Arduino Nano“
  • 2X didelė duonos lenta
  • 2X maža duonos lenta
  • 4X fiksavimo jungiklis (mygtukas)
  • 4X rezistorius
  • 12X jungiamieji laidai nuo vyrų iki vyrų

Dabar pažvelkite į duonos lentos nuotraukas ir žemėlapius, kad surinktumėte vairasvirtes.

  1. Prie mažos duonos lentos pritvirtinkite vieną „Arduino Nano“mikroschemą.
  2. ant didelės duonos lentos pritvirtinkite 2 fiksavimo jungiklius, kaip parodyta paveikslėlyje. Stenkitės, kad duonos lentos dešinė pusė būtų simetriška kairiajai pusei, nes tai padės vairasvirtei atrodyti geriau (kaip simetriją galite naudoti 30 stulpelį) eilutė)
  3. Prijunkite viršutinį kairįjį kairiojo mygtuko kaištį prie 5 V kaiščio, esančio „Arduino“ant mažos duonos lentos (daiktai, kurie yra prijungti prie tos pačios stulpelio duonos lentelėje, yra sujungti vienas su kitu).
  4. Prijunkite dešiniojo mygtuko viršutinį dešinįjį kaištį prie 5 V kaiščio „Arduino“.
  5. Apatinį dešinįjį kairiojo mygtuko kaištį prijunkite prie taško 31 stulpelyje, naudodami rezistorių.
  6. Sujunkite apatinį kairįjį dešiniojo mygtuko kaištį su 29 stulpelio tašku, naudodami rezistorių.
  7. Prijunkite rezistorius prie „Arduino“GND kaiščio.
  8. Prijunkite viršutinį dešinįjį kairiojo mygtuko kaištį prie D3 kaiščio „Arduino“.
  9. Prijunkite viršutinį kairįjį dešiniojo mygtuko kaištį prie „Arduino“kaiščio D9.
  10. Dabar pakartokite šiuos veiksmus ir padarykite antrą valdiklį.

3 žingsnis: „Arduino“prijungimas prie nuoseklaus prievado

„Arduino“prijungimas prie nuoseklaus prievado
„Arduino“prijungimas prie nuoseklaus prievado
„Arduino“prijungimas prie nuoseklaus prievado
„Arduino“prijungimas prie nuoseklaus prievado
„Arduino“prijungimas prie nuoseklaus prievado
„Arduino“prijungimas prie nuoseklaus prievado
„Arduino“prijungimas prie nuoseklaus prievado
„Arduino“prijungimas prie nuoseklaus prievado

Pirmiausia turėsite įdiegti „Arduino IDE“.

Kai jie bus įdiegti, galite pradėti sukurdami „Arduino“programą, kuri gauna įvestis iš mygtukų ir saugo juos nuosekliajame prievade (COM prievadas). Kai „Arduino“plokštė prijungta prie nešiojamojo kompiuterio, operacinė sistema automatiškai atpažįsta plokštę kaip nuoseklųjį prievadą, į kurį programas galima įkelti. Serijiniame prievade saugomos vertės gali būti naudojamos kitame žingsnyje, kai „Unity Engine“prijungiame prie nuoseklaus prievado.

Dabar prijunkime „Arduino“prie serijinio prievado.

Pažiūrėk į paveikslėlius

  1. Prijunkite „Arduino“prie nešiojamojo kompiuterio
  2. Įrankiai> Lenta> Arduino Nano
  3. Jei jūsų „Arduino“lustas yra neseniai (2018–2020 m.) Įrankiai> Procesorius> ATmega328P (senas įkrovos įkėlimo įrenginys).
  4. Jei jūsų „Arduino“lustas nėra neseniai (iki 2018 m.) Įrankiai> Procesorius> ATmega328P
  5. Įrankiai> Uostas> COM (kad ir koks skaičius būtų rodomas, mano atveju jis yra 10). * Tai yra nuoseklusis prievadas, kuriame bus saugomos vertės.
  6. Nukopijuokite kodą ir įklijuokite jį į „Arduino IDE“ir paspauskite „Ctrl“+u, kad įkeltumėte programą.
  7. Pakartokite su antruoju „Arduino“. (atlikdami 5 veiksmą būtinai pasirinkite kitą COM prievadą, kad abu valdikliai nebūtų prijungti prie to paties nuoseklaus prievado).

Kodas:

void setup () {

Serial.begin (9600); pinMode (3, INPUT); // Liepimas „Arduino“gauti įvestį iš D3 kaiščio pinMode (9, INPUT); // Liepimas „Arduino“gauti įvestį iš kaiščio D9} void loop () {if (digitalRead (3) == 1) { /* Jei „Arduino“gauna 1 Serial.write (1) įvestį; iš 3 kaiščio Išveskite reikšmę 1 į nuoseklųjį prievadą Serial.flush (); */ uždelsimas (2); } if (digitalRead (9) == 1) { /* Jei „Arduino“gauna 1 Serial.write (2) įvestį; iš 9 kaiščio Išveskite reikšmę 2 į nuoseklųjį prievadą Serial.flush (); */ uždelsimas (2); }}

Programos paaiškinimas:

Šis kodas tiesiog įvedamas iš D3 kaiščio ir D9 kaiščio „Arduino“, kurie yra prijungti prie mygtukų. Mygtukai yra paspausti arba nespausti, o tai reiškia, kad iš jų gauti rodmenys yra 1 (paspaustas) arba 0 (nespaustas). Jei įvestis iš dešiniojo mygtuko (iš D9) yra 1 (paspaudus), serijiniame prievade išsaugokite 1 reikšmę. Jei įvestis iš kairiojo mygtuko (iš D3) yra 1 (paspaudus), serijiniame prievade išsaugokite 2 reikšmę.

4 žingsnis: „Unity“prijungimas prie nuoseklaus prievado

„Unity“prijungimas prie nuoseklaus prievado
„Unity“prijungimas prie nuoseklaus prievado
„Unity“prijungimas prie nuoseklaus prievado
„Unity“prijungimas prie nuoseklaus prievado

Šiame žingsnyje mes nustatysime „Unity“nuoseklųjį prievadą, kad paspaudus mygtukus jis galėtų gauti įvestis iš „Arduino“. Įdiekite „Visual Studio Code“į savo nešiojamąjį kompiuterį. Tada eikite į „Unity“, pasirinkite 1 grotuvą iš hierarchijos, slinkite žemyn ir pasirinkite pridėti komponentą ir įveskite player1_motion, tada paspauskite „Enter“. Pažvelkite į 1 paveikslą

Inspektoriuje bus sukurtas C# scenarijus, dešiniuoju pelės mygtuku spustelėkite jį ir pasirinkite redaguoti scenarijų, vizualinis studijos kodas turėtų būti atidarytas ir parodys numatytąjį kodą, kuris atrodo kaip 2 paveikslėlis.

Nukopijuokite šį kodą ir pakeiskite „SerialPort sp = new SerialPort („ COM10 “, 9600);“su „SerialPort“sp = naujas „SerialPort“(„COM prievadas, prie kurio prijungtas jūsų„ Arduino ““, 9600); jį galite rasti grįžę prie savo „Arduino“kodo ir pasirinkę „Įrankiai“> „Uostas“> „COM“(kad ir koks skaičius būtų rodomas).

Kodas:

naudojant System. Collections;

naudojant System. Collections. Generic; naudojant „UnityEngine“; naudojant System. IO. Ports; public class player1_motion: MonoBehaviour {plūdės greitis = 8; privati plūdė amounttomove; SerialPort sp = naujas SerialPort ("COM10", 9600); // Startas iškviečiamas prieš pirmą kadro atnaujinimą void Start () {sp. Open (); sp. ReadTimeout = 1; } // Atnaujinimas vadinamas vieną kartą per kadrą void Update () {amounttomove = speed*0.01f; if (sp. IsOpen) {try {moveObject (sp. ReadByte ()); spausdinti (sp. ReadByte ()); } catch (System. Exception) {}}} void moveObject (int kryptis) {if (Direction == 1) {transform. Translate (Vector3.left*amounttomove, Space. World); } if (kryptis == 2) {transform. Translate (Vector3.right*amounttomove, Space. World); }}}

Kodo paaiškinimas:

Šis kodas nurodo „Unity“gauti įvestis iš nuoseklaus prievado (COM 10). Paspaudus kairįjį mygtuką, „Arduino“siunčia reikšmę 1 į nuoseklųjį prievadą, jei vienybė gauna 1 iš nuoseklaus prievado, greitis pridedamas prie žaidimo objekto „žaidėjas 1“kairiąja kryptimi. Paspaudus dešinįjį mygtuką, „Arduino“siunčia 2 reikšmę į nuoseklųjį prievadą, jei „Unity“gauna 2 iš serijinio prievado, greitis pridedamas prie žaidimo objekto „žaidėjas 1“teisinga kryptimi. jei serijinis prievadas negauna vertės iš nuoseklaus prievado, greitis nepridedamas nė viena kryptimi, todėl plokštė lieka nejudanti.

Nukopijavę kodą, paspauskite F5, kad sukurtumėte ir paleistumėte kodą. Grįžkite į vienybę ir paspauskite atkūrimo mygtuką. 1 žaidėjas turėtų judėti į dešinę, kai paspausite dešinę, ir kairę, kai paspausite kairę.

Dabar dar kartą atlikite tuos pačius veiksmus, bet su 2 grotuvu ir būtinai įrašykite „Pridėti komponentą“player2_motion, o ne player1_motion, ir nurodykite antrąjį COM prievadą, prie kurio prijungtas antrasis valdiklis, o ne tą patį nuoseklųjį prievadą.

Pačiame kode taip pat turėsite pakeisti „public class player1_motion: MonoBehaviour“į „public class player2_motion: MonoBehaviour“į „public class player2_motion: MonoBehaviour“.

5 žingsnis: pridėkite kamuolį

Kamuolio pridėjimas
Kamuolio pridėjimas
Kamuolio pridėjimas
Kamuolio pridėjimas
Kamuolio pridėjimas
Kamuolio pridėjimas
  1. Pridėkite naują žaidimo objektą, tačiau šį kartą vietoj kvadrato pasirinkite ratą.
  2. Pervardykite jį „kamuoliu“.
  3. Vilkite ir numeskite hierarchijoje.
  4. Sureguliuokite skalę (X: 0,2 - Y: 0,2 - Z: 0,2).
  5. Pridėkite „Rigidbody 2D“ir užšaldykite tik Z ašį.
  6. Pakeiskite masę į 0,0001
  7. Pakeiskite gravitacijos skalę į 0.
  8. Pridėkite „Box Collider 2D“.
  9. Eikite į Turtas> Sukurti> Fizikos medžiaga 2D Pažvelkite į 1 paveikslėlį
  10. pakeisti pavadinimą į „atšokti“
  11. Pakeiskite inspektoriaus trintį į nulį
  12. Pakeiskite inspektoriaus atšokimą į 1
  13. Vilkite ir numeskite „atšokimą“į „Rigidbody 2D“> Medžiaga Pažvelkite į 2 paveikslėlį
  14. Dar kartą pasirinkite „kamuolys“iš hierarchijos ir eikite, kad pridėtumėte komponentą, įveskite Ball_movement, tada paspauskite „Enter“.
  15. Dešiniuoju pelės mygtuku spustelėkite scenarijų ir pasirinkite redaguoti scenarijų.
  16. Nukopijuokite žemiau esantį kodą ir paspauskite F5, kad sukurtumėte ir paleistumėte.

Kodas:

naudojant System. Collections;

naudojant System. Collections. Generic; naudojant „UnityEngine“; public class Ball_movement: MonoBehaviour {// Startas iškviečiamas prieš pirmą kadro atnaujinimą private float force = 2; void Start () {StartCoroutine (move ()); } IEnumerator move () {derlius grąžina naują WaitForSeconds (2); GetComponent (). AddForce (nauja Vector2 (1f, 0,5f)*0,02f*jėga); }}

Kodo paaiškinimas

Šis kodas suteikia rutuliui vienodo dydžio greitį abiem kryptimis X kryptimi ir Y kryptimi, todėl kamuolys juda 45 ° kampu. 8 žingsnyje mes pridėjome prie kamuolio fizinę medžiagą ir pakeitėme jos atšokimą, tai išlaiko rutulio judėjimą per žaidimą.

6 veiksmas: žaidimo užbaigimas

Žaidimo užbaigimas
Žaidimo užbaigimas
Žaidimo užbaigimas
Žaidimo užbaigimas
Žaidimo užbaigimas
Žaidimo užbaigimas
Žaidimo užbaigimas
Žaidimo užbaigimas

Dabar turime padaryti galimybę pralaimėti, jei žaidžiate žaidimą, pastebėsite, kad kai kamuolys prasilenkia su 1 ar 2 žaidėju, jis tiesiog atšoka nuo sienos ir tai nėra būtent tai, ko mums reikia mūsų žaidime. Vietoj to mes norime sukurti taškų skaitiklį, kuris skaičiuoja rezultatą kiekvieną kartą, kai kamuolys susiduria su aukštyn arba žemyn esančiomis sienomis, ir iš naujo nustatyti rutulio padėtį.

  1. Vilkite ir numeskite kamuolį iš Hierarchijos į projektą. Sukūrėte rutulio surenkamąjį elementą, kad galėtumėte jį naudoti vėliau.
  2. Dešiniuoju pelės mygtuku spustelėkite hierarchiją ir pasirinkite Sukurti tuščią. pasirodys tuščias objektas, pervadinkite jį į kamuoliuko atkūrimą ir pakeiskite jo poziciją taip, kaip rutulio padėtis.
  3. Dešiniuoju pelės mygtuku spustelėkite hierarchiją ir pasirinkite UI >> Tekstas. Atkreipkite dėmesį, kad tekstas lydi drobę, o teksto padėtis žaidime priklauso nuo teksto padėties drobėje, o ne nuo mūsų žaidimo ribų. (Pažvelkite į 1 paveikslą).
  4. Pakeiskite teksto padėtį į bet kurią norimą vietą.
  5. Dar kartą pakartokite 3 ir 4 veiksmus, kad gautumėte antrojo žaidėjo rezultatą.
  6. Įveskite pirmąjį tekstą „1 žaidėjo balas: 0“, o antrąjį - „2 žaidėjo rezultatas: 0“. (Pažvelkite į 2 paveikslą).
  7. Sukurkite scenarijų viršutiniame krašte, vadinamą p1wins, ir nukopijuokite šį kodą.

Kodas:

naudojant System. Collections;

naudojant System. Collections. Generic; naudojant „UnityEngine“; naudojant „UnityEngine. SceneManagement“; naudojant „UnityEngine. UI“; public class p1wins: MonoBehaviour {public Text score; public Transform ball_respawn; viešas „GameObject“kamuolys; privatus int p1 = 0; // Startas iškviečiamas prieš pirmą kadro atnaujinimą void Start () {} // Atnaujinimas iškviečiamas kartą per kadrą void Update () {score.text = "1 žaidėjo rezultatas:" + p1; } void OnCollisionEnter2D (Collision2D other) {if (other.gameObject.tag == "Ball") {Destroy (other.gameObject); p1 ++; Instantiate (kamuolys, kamuolys_repawn.position, ball_respawn.rotation); }}}

8. Vilkite ir numeskite rutulio surenkamąjį elementą iš projekto 1 žingsnyje į kamuoliuko parametrą. (Pažvelkite į 3 paveikslą)

9. Vilkite ir numeskite rutulį, perstatytą iš hierarchijos į parametrą Ball-rerspawn. (Pažvelkite į 3 paveikslą)

10. nuvilkite 1 žaidėjo rezultatą iš hierarchijos į Score parametrą. (Pažvelkite į 3 paveikslą)

Kodo paaiškinimas:

Kai kamuolys susiduria su viršutine riba, jis sunaikina ir vėl atsistato į „ball_respawn“poziciją, kurią priskyrėme 2 žingsnyje. Tikslas padaryti rutulį kaip surenkamąjį yra sugebėti jį atkurti su visomis jo savybėmis, kitaip, jei mes panaudojome kamuolį iš hierarchijos jis atsigaus, bet nejudės. Taip pat, kai kamuolys susiduria su viršutine riba, vertė, kuri iš pradžių yra lygi 0, vadinama p1, padidėja 1. Ši vertė rodoma kaip tekstas, taigi, kai kamuolys susiduria su viršutine riba, 1 žaidėjo rezultatas padidėja 1.

Dabar atlikite 7, 8, 9 ir 10 veiksmus žemyn

7 veiksmui sukurkite scenarijų, pavadintą p2wins, ir nukopijuokite šį kodą.

atlikdami 10 veiksmą, nuvilkite 2 žaidėjo rezultatą iš hierarchijos į balo parametrą.

Kodas:

naudojant System. Collections;

naudojant System. Collections. Generic; naudojant „UnityEngine“; naudojant „UnityEngine. SceneManagement“; naudojant „UnityEngine. UI“; public class p2wins: MonoBehaviour {public Text score; public Transform ball_respawn; viešas „GameObject“kamuolys; privatus int p2 = 0; // Startas iškviečiamas prieš pirmą kadro atnaujinimą void Start () {} // Atnaujinimas iškviečiamas kartą per kadrą void Update () {score.text = "2 žaidėjo rezultatas:" + p2; } void OnCollisionEnter2D (Collision2D other) {if (other.gameObject.tag == "Ball") {Destroy (other.gameObject); p2 ++; Instantiate (kamuolys, kamuolys_repawn.position, ball_respawn.rotation); }}}

Rekomenduojamas: