Paano Gumawa ng isang Custom na Controller ng Laro Sa Arduino at Pagkakaisa

Paano Gumawa ng isang Custom na Controller ng Laro Sa Arduino at Pagkakaisa

Nais mo na bang mag-disenyo ng iyong sariling game controller? Ito ay mas madali kaysa sa iniisip mo!





Sa maikling proyekto na ito ay magtatayo kami ng isang simpleng pasadyang tagakontrol ng laro upang magamit sa engine ng laro ng Unity. Ang tagakontrol na ito ay papatakbo ng isang Arduino Uno, kahit na maaari mong gamitin ang isa sa maraming mga kahalili doon para sa proyektong ito. Lilikha rin kami ng isang pangunahing laro kung saan gagamitin mo ang iyong controller upang maiwasan ang mga mahulog na mga bagay at pabagalin ang oras.





Para sa Project na Kakailanganin Mo

  • Arduino o katulad na microcontroller
  • 1 x 10k Ohm risistor
  • 1 x Sandali na paglipat
  • 1 x Potensyomiter
  • Mga wire na pang-hook
  • Isang breadboard
  • Makina ng laro ng pagkakaisa
  • Ang Uniduino plugin mula sa Unity Asset Store ($ 30)
  • Kumpletuhin ang code ng proyekto, kung sakaling hindi mo nais na isulat ito (hindi kasama ang Uniduino plugin)

Karamihan sa mga bagay na ito ay magagamit sa isang Arduino starter kit. Kung wala kang isang starter kit tingnan ang aming gabay para sa pagpili ng pinakamahusay para sa iyo.





Maaari mong gawin ang iyong controller na kumplikado hangga't gusto mo, bagaman para sa halimbawang ito ay magse-set up kami ng isang potensyomiter at isang pindutan - perpekto para sa pagkontrol ng isang simpleng arcade game.

Pagtitipon ng Iyong Controller

I-set up ang iyong breadboard at Arduino tulad ng ipinakita sa imahe sa ibaba. Ito ang gagamitin namin bilang aming controller ng laro, kahit na maaari mong gamitin ang halos eksaktong eksaktong pag-set up bilang isang DIY midi controller masyadong!



Paghahanda ng Iyong Arduino

Kapag mayroon ka nang lahat ng na-wire, ikonekta ang iyong Arduino sa pamamagitan ng USB. Sa Arduino Software IDE magtungo sa Mga tool> Lupon at Mga tool> Port upang mapili kung aling microcontroller at port ang iyong ginagamit. Ang Arduino IDE ay kasama ng sketch na kailangan namin, at mahahanap mo ito sa ilalim File> Mga Halimbawa> Firmata> StandardFirmata . I-click ang I-upload at handa ka nang umalis.

Kung bago ka sa Arduino at ang iyong ulo ay natutunaw nang bahagya, tingnan ang aming Gabay ng Baguhan upang matulungan kang mausap ito nang maayos sa iyong computer.





Pagse-set up ng Iyong Unity Project

Sa Unity, buksan Window> Tindahan ng Asset upang mai-access ang Unity's Asset Store mula sa loob ng Unity Editor. Maghanap sa Asset Store para sa Uniduino plugin. Papayagan ka ng plugin na ito na makatanggap at magpadala ng data sa at mula sa iyong mga pin ng Arduino sa loob ng Unity. Ang plugin sa oras ng pagsulat ay nagkakahalaga ng $ 30. Posible upang gawin ang proyektong ito nang hindi bumibili ng plugin, kahit na ito ay mas kumplikado at maaari mong makita ang plugin na mas maginhawa sa buong pag-ikot.

Dadalhin ka ng video na ito mula sa mga tagalikha ng plugin sa proseso ng pagsubok na gumagana ang lahat, kasama ang pag-set up ng unang pagkakataon. Tandaan na maaari mo ring i-reset ang editor ng Unity sa Windows.





Maaari naming gamitin ang parehong panel ng pagsubok na ito upang subukan ang aming controller. Itakda ang Pin D2 sa INPUT at Digital. Dagdag na pababa, itakda ang Pin A5 sa ANALOG. Ang iyong potensyomiter at pindutan ay dapat magpakita ng mga halaga sa screen sa tabi ng kanilang mga pin number ngayon. Pag-unlad!

Ngayon upang Gumawa ng Isang bagay na Maaari nating Montrol

Sa gayon mayroon kaming isang tagakontrol, ngunit ano ang aming makokontrol? Sa gayon, ang mga posibilidad ay walang katapusan, ngunit para sa araw na ito ay lilikha kami ng isang napaka-simpleng dodging game upang subukan ang aming bagong control system. Malilipat kami nang mabilis sa pag-set up ng laro, kaya kung ganap kang bago sa Unity engine maaari kang makahanap ng aming Gabay sa Nagsisimula ng Programming ng Laro ng Unity kapaki-pakinabang upang makuha ang iyong mga bearings.

Bumubuo kami ng isang napaka-pangunahing laro kung saan ang iyong hangarin ay upang maiwasan ang iyong globo sa kaliwa at kanan upang maiwasan ang mga nahuhulog na cube, na gagamitin ang iyong bagong ginawa na pasadyang tagakontrol.

Lumikha ng isang bagong eksena at i-drag ang Uniduino prefab mula sa Mga Asset> Uniduino> Prefabs sa iyong hierachy at i-drag ang Uniduino prefab sa hierarchy. Kailangan namin ito doon upang gawin ang pakikipag-usap sa pagitan ng aming laro at controller.

Sa pag-click sa hierarchy ng Unity Lumikha> Sphere at gamitin ang tab na Transform sa Inspector upang ilipat ito sa ilalim ng screen ng laro.

Oras na upang Kumuha ng Coding

Ngayon upang magdagdag ng ilang code sa partido na ito. Sa napiling globo sa Hierarchy, mag-click Magdagdag ng Component> Bagong Script sa ilalim ng window ng Inspektor. Pangalanan ito sphereMover at piliin C Matalas mula sa drop down na menu. Mag-click Lumikha at Magdagdag at ang script ay idaragdag sa GameObject. Mag-double click dito upang buksan ang script at ipasok ang code na ito:

using UnityEngine;
using System.Collections;
using Uniduino;
public class sphereMover : MonoBehaviour
{
//Headers aren't scrictly neccesary, but they make life easier back in the Inspector.
[Header('Arduino Variables')]
//we need to declare the Arduino as a variable
public Arduino arduino;
//we need to declare an integer for the pin number of our potentiometer,
//making these variables public means we can change them in the editor later
//if we change the layout of our arduino
public int potPinNumber;
//a float variable to hold the potentiometer value (0 - 1023)
public float potValue;
//we will later remap that potValue to the y position of our capsule and hold it in this variable
public float mappedPot;
//public int for our button pin
public int buttonPinNumber;
[Header('Sphere Variables')]
//variables to hold the values we noted earlier for the sides of our screen
public float leftEdge;
public float rightEdge;
// Use this for initialization
void Start ()
{//and initialize we shall, starting with the Arduino Variable.
//we are only using one arduino, so we can use Arduino.global to grab it.
arduino = Arduino.global;
arduino.Setup(ConfigurePins);
}
void ConfigurePins()
{
//configure the Arduino pin to be analog for our potentiometer
arduino.pinMode(potPinNumber, PinMode.ANALOG);
//Tell the Arduino to report any changes in the value of our potentiometer
arduino.reportAnalog(5, 1);
//configure our Button pin
arduino.pinMode(buttonPinNumber, PinMode.INPUT);
arduino.reportDigital((byte)(buttonPinNumber / 8), 1);
}
}

Maglaan ng sandali upang basahin ang mga komento sa code. Sa ngayon, idineklara namin ang ilang mga variable para sa aming Arduino, mga pin nito, at aming Sphere. Ginamit din namin ang

Simulan at I-configure ang mga pamamaraan upang mapasimulan ang aming Arduino sa run time. Hinahayaan nating i-save ang aming script, at bumalik sa editor ng Unity at makita kung ano ang nagbago.

Makikita na namin ang aming mga variable ng publiko sa window ng Inspektor. Tingnan natin kung ano ang maaari nating ipasok sa yugtong ito upang matulungan tayo sa paglaon. Alam namin kung anong pin ang ginagamit namin sa Arduino mula sa aming build nang mas maaga, maaari naming ipasok ang mga ito. Alam din namin mula sa aming eksperimento nang mas maaga kung gaano kalayo ang nais namin na ang aming globo ay makapaglalakbay kaliwa at kanan upang hindi ito mahulog sa screen. Hinahayaan nating ipasok ang mga halagang ito ngayon.

Mga Unang Palatandaan ng Buhay

Panahon na upang talagang makita ang mga halaga mula sa aming Arduino sa loob ng Unity Editor. Sa ngayon, maaari kaming magdagdag ng isang linya ng code sa pag-andar ng aming sphereMover script, at mai-save muli ang script.

void Update ()
{
//We assign the value the arduino is reading from our potentionmeter to our potValue variable
potValue = arduino.analogRead(potPinNumber);
}

Ngayon na mayroon kaming variable ng aming potValue na ina-update bawat frame, maaari naming makita ang halaga nito sa real time sa Unity Inspector. Bago namin ito subukan, ngayon ay magiging isang magandang panahon upang suriin kung ang Uniduino plug in ay nakikinig sa tamang port. Mag-click sa Uniduino sa Heirarchy, at suriin ang Pangalan ng Port sa Inspector. Kung blangko ito, punan ang tamang numero ng port para sa iyong Arduino. Sa kasong ito ito ay COM4, ​​bagaman maaaring magkaiba ito para sa iyo. Suriin ang paggamit ng Arduino IDE kung hindi ka sigurado.

Piliin ang iyong globo sa hierarchy at i-click ang Play button sa tuktok ng screen. Ang sistema ay nangangailangan ng ilang segundo upang magpasimula, pagkatapos na dapat mong simulang makita ang pagbabago ng variable ng Pot Value sa inspektor kapag inilipat mo ang potensyomiter.

Ngayon ay nagsasalita kami! Sa gayon, mahigpit na nagsasalita ang Unity at ang Arduino ay nagsasalita, ngunit sino ang nagbibilang? Kung nakuha mo ito hanggang ngayon at hindi mo nakikita ang pagbabago ng halaga sa inspektor, suriin ang mga hakbang sa pag-set up, at tiyaking mayroon kang tamang Port na napili para sa iyong Arduino.

Ilipat Natin Ito

Ngayon na mayroon kaming na-update na variable ng potValue, nais naming gamitin ang halagang ito upang ilipat ang aming globo. Kapag ang potentiometer ay ang lahat ng paraan sa kaliwa nais naming ang globo ay nasa kaliwang bahagi ng screen, at vice versa. Ang Mga Bagay sa Pagkakaisa ay nakaposisyon sa isang punto sa puwang ng Vector, na tinutukoy ng mga halaga nito Pagbabago.posisyon . Sa imahe sa ibaba, kung saan ang sphere ay nasa pinakamalayo na punto sa kaliwa na nais namin ito, makikita mo na ang posisyon ng vector ay 9.5, -4, 0.

Nais naming maapektuhan ang posisyon ng X ng sphere. Sa kasamaang palad ang paggamit ng mga halaga mula sa aming potensyomiter nang direkta ay hindi gagana, tulad ng kapag ang potensyomiter ay hanggang sa kaliwa nagbibigay ito ng halagang 0 - na maglalagay mismo ng aming sphere sa gitna ng screen. Sa iba pang matinding, ang nangungunang halaga ng potensyal, 1023, ay ilalagay ang kubo patungo sa kanan ng aming screen. Hindi kapaki-pakinabang Ang kailangan namin dito ay ilang matematika.

Bakit Ginagawa Ito Para sa Iyo ng Math?

Para sa iyo sa labas diyan nakakatakot na nakatingin sa isang piraso ng papel na natatakpan ng mga nonsensical na numero (bagaman mayroong ilan mahusay na mga website na makakatulong sa iyo na matuto ng Matematika), huwag matakot. Kailangan namin ng isang paraan ng paggawa ng mga halaga ng aming potensyomiter upang umayon sa posisyon ng X ng aming sphere. Sa kabutihang palad, maaari naming magamit ang isang Paraan ng Extension .

Ang isang Paraan ng Extension ay isang script na gumagawa ng isang tukoy na trabaho para sa amin. Sa kasong ito, binibigyan namin ito ng mga halagang mayroon kami, at ibinabalik ang mga ito sa kanilang mapa sa isa't isa, handa nang magamit sa aming sphereMover iskrip. Sa tuktok ng panel ng Project, mag-click Lumikha> C # Script at pangalanan itong ExtensionMethods. Ipasok ang code sa ibaba sa script:

using UnityEngine;
using System.Collections;
public static class ExtensionMethods {

//our handy dandy Remapper function
public static float Remap (this float value, float from1, float to1, float from2, float to2)
{
return (value - from1) / (to1 - from1) * (to2 - from2) + from2;
}
}

I-save ang script, at bumalik sa iyong script ng sphereMover. Maaari na naming magamit ang pagpapaandar na ito ng Remap sa aming script ng ExtensionMethods sa aming pag-andar ng Update upang i-convert ang aming mga halaga ng potensyomiter sa mga magagamit na halaga sa aming laro. Sa ilalim kung saan namin lang itinalaga ang variable ng potValue, i-type ang sumusunod:

Ipinapakita sa amin ng prompt na ang aming Remap ay tumatagal ng dalawang hanay ng mga halagang Mula at Sa, at pinagsama ang mga ito. Maaari naming ipasok ang aming mga halaga dito.

mappedPot = potValue.Remap(0, 1023, leftEdge, rightEdge);

I-save ang iyong script, bumalik sa editor ng Unity, at pindutin ang pindutan ng pag-play. Dapat mo na ngayong makita na ang variable ng Mapped Pot ay nagbabago kapag inilipat mo ang potensyomiter, upang umayon sa mga halagang natukoy namin para sa aming Kaliwa at Kanan na Mga Mataas. Maglaan ng sandali upang umupo at pasalamatan ang iyong iskrip ng ExtensionMethods. Hindi isang calculator sa paningin.

Tandaan: kung napansin mo na ang iyong mga halaga ay baligtad, kaya't kapag ang iyong potensyomiter ay hanggang sa kanan nakakakuha ka ng isang negatibong halaga para sa iyong variable na Mapped Pot, maaari mong mai-set up ang iyong potensyomiter sa maling paraan. Sa kabutihang palad, maaayos mo ito nang hindi gumagawa ng anumang rewiring. Maaari mo lamang palitan ang mga halaga kapag muling nai-remap mo ang mga ito:

Ngayon sa wakas ay mayroon kaming mga magagawang halaga. Ngayon ang natitirang gawin ay upang italaga ang mga halagang iyon sa posisyon ng X ng aming sphere:

bakit ang google ay gumagamit ng sobrang memorya
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

I-save ang iyong script, bumalik sa editor ng Unity at pindutin ang play. Dapat mo na ngayong ilipat ang iyong Sphere sa kaliwa at kanan gamit ang iyong potensyomiter!

Paglalagay ng Button upang gumana

Ngayon na gumagalaw na ang ating globo, hindi ba masarap na magkaroon ng isang paraan upang pabagalin nang kaunti ang mga bagay kapag nakarating tayo sa isang masikip na lugar? Gagamitin namin ang aming pindutan upang pabagalin ang oras sa aming laro. Buksan ang iyong sphereMover script, at idagdag ang code na ito sa iyong pag-andar ng Update

//if Unity detects the button is being pressed, the time scale slows down
if (arduino.digitalRead(buttonPinNumber) == 1){
Time.timeScale = 0.4f;
}
else Time.timeScale = 1.0f;

Ngayon mayroon kaming mga mekanika ng aming laro, magdagdag kami ng ilang mga hadlang! Gagamitin namin ang natural na kalaban ng globo, ang kubo. Sa hierarchy, mag-click Lumikha> 3d Bagay> Cube . Sa inspektor ng cube, Magdagdag ng Component> Physics> Rigidbody . Itakda ang halaga ng Pag-drag ng rigidbody sa 5. Gayundin, sa ilalim ng bahagi ng Box Collider sa inspektor, piliin ang Is Trigger. Papayagan kaming makakita ng mga banggaan sa aming Sphere.

Lumikha ng isang script sa kubo at tawagan ito collideWithSphere , buksan ang script at tanggalin ang mga pag-andar ng Start at Update dahil hindi namin kakailanganin ang mga ito sa oras na ito. Ipasok ang code na ito:

using UnityEngine;
using System.Collections;
public class collideWithSphere : MonoBehaviour
{
void OnTriggerEnter(Collider other)
{
Destroy(other.gameObject);
}
}

Nagpapadala ng mensahe ang OnTriggerEnter sa tuwing tumatama ang trigger collider sa isa pang collider. Sa pagkakataong ito, sinasabihan namin ito na sirain ang anumang mahipo nito. I-save ang script at bumalik sa editor ng Unity. I-drag ang cube mula sa hierarchy patungo sa panel ng Project. Mapapansin mo ang teksto ng kubo sa hierarchy ay naging asul. Ito ay dahil lumikha kami ng isang prefab at nai-save ito sa aming proyekto. Tanggalin ang iyong cube mula sa hierarchy ngayon.

Ang kailangan lang namin ngayon ay isang script upang mag-spawn ng mga cube. Sa hierarchy click Lumikha> Lumikha ng Walang laman , at palitan ang pangalan nito sa Game Manager sa Inspector at magdagdag ng isang script dito na tinatawag na gameManager. Buksan ang script at idagdag ang code na ito:

using UnityEngine;
using System.Collections;
public class gameManager : MonoBehaviour {
//a variable to hold the prefab we want to spawn
public GameObject cube;
//we want some variables to decide how any cubes to spawn
//and how high above us we want them to spawn
public int numberToSpwan;
public float lowestSpawnheight;
public float highestSpawnheight;
// Use this for initialization
void Start ()
{
for (int i = 0; i {
Instantiate(cube, new Vector3(Random.Range(-9, 9), Random.Range(lowestSpawnheight, highestSpawnheight), 0), Quaternion.identity);
}
}

// Update is called once per frame
void Update ()
{

}
}

I-save ang script. Bumalik sa editor, piliin ang Game Manager sa hierarchy, at i-drag ang iyong cube prefab mula sa panel ng proyekto patungo sa variable ng Cube sa Inspector. Punan din ang mga halaga para sa iyong pangingitlog dito. Maaari kang makalikot dito upang gawin itong mahirap o madali hangga't gusto mo. Tandaan na ito ay nagkakahalaga ng pagkakaroon ng iyong pinakamababang cube na may sapat na mataas na itlog upang payagan ang Uniduino na magpasimula - ang pagkawala ng laro bago ka makagalaw ay maaaring maging nakakabigo!

Ang Tapos na Project

Ngayon kapag pinindot mo ang paglalaro, ang mga cube ay magbubuga sa itaas mo at mahuhulog. Maaari mong gamitin ang iyong potensyomiter upang maiwasan ang mga ito, at ang iyong pindutan upang pabagalin ang oras.

Sa proyektong ito lumikha kami ng isang pasadyang tagakontrol na may isang Arduino, na-configure ang Unity at Uniduino upang makipag-usap dito, at lumikha ng isang simpleng laro upang subukan ito. Ang mga konsepto dito ay maaaring mailapat sa halos anumang proyekto, at may mga pantay mga jam ng laro na nagdadalubhasa sa pasadyang mga Controller .

Sa Arduino at Unity maaari kang lumikha ng isang pasadyang controller mula sa halos anumang bagay. Nilikha mo ba ang isang hi-fi na kumokontrol sa isang spacecraft? Isang toaster na kumokontrol sa isang laro sa platform?

Kung gumawa ka ng isang proyekto tulad nito Gusto kong makita ito! I-post ito sa mga komento sa ibaba!

Magbahagi Magbahagi Mag-tweet Email 6 Mga kahaliling Napapakinggan: Ang Pinakamahusay na Libre o Murang Audiobook Apps

Kung hindi mo pinangarap na magbayad para sa mga audiobook, narito ang ilang magagaling na apps na hinahayaan kang makinig sa kanila nang libre at ligal.

Basahin Susunod
Mga Kaugnay na Paksa
  • DIY
  • Programming
  • Arduino
  • Game Controller
  • Pag-unlad ng Laro
Tungkol sa May-akda Ian Buckley(216 Mga Artikulo Nai-publish)

Si Ian Buckley ay isang freelance journalist, musikero, tagaganap at tagagawa ng video na naninirahan sa Berlin, Germany. Kapag hindi siya nagsusulat o nasa entablado, nakikipag-usap siya sa mga elektronikong DIY o code sa pag-asang maging isang baliw na siyentista.

Higit pa Mula kay Ian Buckley

Mag-subscribe sa aming newsletter

Sumali sa aming newsletter para sa mga tip sa tech, pagsusuri, libreng ebook, at eksklusibong deal!

Mag-click dito upang mag-subscribe
Kategorya Diy