Как да си направим персонализиран контролер за игри с Arduino и Unity

Как да си направим персонализиран контролер за игри с Arduino и Unity

Искали ли сте някога да проектирате свой собствен контролер за игри? По -лесно е, отколкото си мислите!





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





За този проект ще имате нужда

  • Arduino или подобен микроконтролер
  • 1 x 10k Ohm резистор
  • 1 x Моментен превключвател
  • 1 x Потенциометър
  • Свързващи проводници
  • Макет
  • Двигател на играта Unity
  • Приставката Uniduino от Unity Asset Store ($ 30)
  • Пълен код на проекта, в случай че не искате да го изпишете (не включва приставката Uniduino)

Повечето от тези неща се предлагат в стартов комплект Arduino. Ако нямате стартов комплект, разгледайте нашето ръководство за избор на най -добрия за вас.





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

Сглобяване на вашия контролер

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



Подготовка на вашия Arduino

След като свържете всичко свързано, свържете вашия Arduino чрез USB. В Arduino Software IDE отидете на Инструменти> Табло и Инструменти> Порт за да изберете кой микроконтролер и порт използвате. Arduino IDE идва в комплект със скицата, от която се нуждаем, и можете да я намерите под File > Examples > Firmata > StandardFirmata . Щракнете върху Качване и ще бъдете готови за работа.

Ако сте нов в Arduino и главата ви се топи леко, вижте нашата Ръководство за начинаещи за да ви помогне да го накарате да говори добре с вашия компютър.





Настройване на вашия проект за единство

В Unity отворете Прозорец> Магазин за активи за достъп до Asset Store на Unity от редактора на Unity. Потърсете в магазина за активи Uniduino плъгин. Този плъгин ще ви позволи да получавате и изпращате данни към и от вашите пинове на Arduino в Unity. Плъгинът по време на писането струва 30 долара. Възможно е да направите този проект, без да купувате приставката, макар че е доста по -сложна и може да намерите плъгина по -удобен навсякъде.

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





Можем да използваме същия тест панел, за да тестваме нашия контролер. Задайте Pin D2 на INPUT и Digital. По -надолу, задайте Pin A5 на ANALOG. Вашият потенциометър и бутон сега трябва да показват стойности на екрана до техните пинове. Напредък!

Сега да направим нещо, което можем да контролираме

Значи имаме контролер, но какво да контролираме? Е, възможностите са безкрайни, но за днес ще създадем много проста игра за избягване, за да изпробваме новата си система за управление. Ще преминем към настройката на играта доста бързо, така че ако сте напълно нов в двигателя на Unity, може да намерите нашия Ръководство за начинаещи програмиране на Unity игри полезно да се ориентирате.

Ще изградим много основна игра, в която вашата цел е да избягате от сферата си наляво и надясно, за да избегнете падащи кубчета, което ще използва вашия новоизработен персонализиран контролер.

Създайте нова сцена и плъзнете сглобяемата Uniduino от Активи> Uniduino> Сглобяеми във вашата йерархия и плъзнете сглобяемата Uniduino в йерархията. Имаме нужда от него, за да говорим между нашата игра и контролера.

В йерархията на Unity щракнете Създаване> Сфера и използвайте раздела Transform в Inspector, за да го преместите в долната част на екрана на играта.

Време е да получите кодиране

Сега, за да добавите малко код към тази партия. Щракнете върху сферата, избрана в йерархията Добавяне на компонент> Нов скрипт в долната част на прозореца на инспектора. Назовете го sphereMover и изберете C Остър от падащото меню. Щракнете Създаване и добавяне и скриптът ще бъде добавен към GameObject. Щракнете двукратно върху него, за да отворите скрипта и въведете този код:

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);
}
}

Отделете малко време, за да прочетете коментарите за кода. Досега декларирахме някои променливи за нашия Arduino, неговите щифтове и нашата сфера. Ние също използвахме

Методи Start и ConfigurePins за инициализиране на нашия Arduino по време на изпълнение. Да запазим нашия скрипт и да се върнем в редактора на Unity и да видим какво се е променило.

Вече можем да видим нашите публични променливи в прозореца Inspector. Нека видим какво можем да въведем на този етап, за да ни помогне по -късно. Ние знаем какви щифтове използваме на Arduino от нашата по -ранна версия, можем да ги въведем. Ние също знаем от нашия експеримент по -рано колко далеч искаме нашата сфера да може да пътува наляво и надясно, така че да не пада от екрана. Нека сега въведем тези стойности.

Първите признаци на живот

Време е всъщност да видим стойности от нашия Arduino в Unity Editor. Засега можем да добавим един ред код към функцията за актуализация на скрипта SphereMover и да запазим скрипта отново.

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

Сега, когато нашата променлива potValue се актуализира всеки кадър, можем да видим стойността му в реално време в Unity Inspector. Преди да го тестваме, сега би било подходящ момент да проверим дали щепселът на Uniduino слуша на правилния порт. Кликнете върху Uniduino в Heirarchy и проверете името на порта в Inspector. Ако е празно, попълнете правилния номер на порта за вашия Arduino. В този случай това беше COM4, ​​въпреки че може да е различно за вас. Проверете с помощта на Arduino IDE, ако не сте сигурни.

Изберете сферата си в йерархията и щракнете върху бутона Възпроизвеждане в горната част на екрана. Системата се нуждае от няколко секунди, за да се инициализира, след което трябва да започнете да виждате промяна на променливата Pot Value в инспектора, когато преместите потенциометъра.

Сега говорим! Е, строго казано Unity и Arduino говорят, но кой брои? Ако сте стигнали дотук и не виждате промяната на стойността в инспектора, проверете стъпките за настройка и се уверете, че сте избрали правилния порт за вашия Arduino.

Нека преместим тази сфера

Сега, когато имаме актуализираната променлива potValue, искаме да използваме тази стойност за преместване на нашата сфера. Когато потенциометърът е докрай наляво, искаме сферата да е в лявата страна на екрана и обратно. Обектите в Unity са позиционирани в точка от векторното пространство, определена от стойностите на it Transform.position . На изображението по -долу, където сферата е в най -отдалечената точка вляво, бихме искали, можете да видите, че векторът на нейната позиция е 9,5, -4, 0.

Искаме да повлияем на X позицията на сферата. За съжаление директното използване на стойностите от нашия потенциометър няма да работи, тъй като когато потенциометърът е вляво, той дава стойност 0 - което би поставило нашата сфера точно в средата на екрана. В другата крайност най -високата стойност на потенциометъра, 1023, би поставила куба далеч вдясно от нашия екран. Безполезно. Тук ни трябва малко математика.

Защо да правите математика, когато Unity ще го направи вместо вас?

За тези от вас, които се страхуват да зяпат лист хартия, покрит с безсмислени числа (въпреки че има такива страхотни уебсайтове което може да ви помогне да научите математика), не се страхувайте. Нуждаем се от начин нашите стойности на потенциометъра да съответстват на позицията на X на нашата сфера. За щастие можем да използваме Метод на удължаване .

Методът за разширение е скрипт, който върши конкретна работа за нас. В този случай ние му даваме стойностите, които имаме, и той ги връща съпоставени една с друга, готови за използване в нашия sphereMover скрипт. В горната част на панела „Проект“ щракнете върху Създаване> C# скрипт и го наречете ExtensionMethods. Въведете кода по -долу в скрипта:

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;
}
}

Запазете скрипта и се върнете към скрипта сфераMover. Вече можем да използваме тази функция Remap в нашия скрипт ExtensionMethods в нашата функция Update, за да преобразуваме стойностите на нашия потенциометър в използваеми стойности в нашата игра. Под мястото, където току -що сме задали променливата potValue, въведете следното:

Подканата ни показва, че нашата Remap взема два набора от и до стойности и ги съпоставя заедно. Можем да въведем нашите ценности в това.

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

Запазете скрипта си, върнете се в редактора на Unity и натиснете бутона за възпроизвеждане. Сега трябва да видите, че променливата Mapped Pot се променя, когато премествате потенциометъра, за да съответства на стойностите, които сме определили за нашите ляв и десен ръб. Отделете малко време, за да седнете и да благодарите на вашия скрипт ExtensionMethods. Не се вижда калкулатор.

Забележка: ако забележите, че вашите стойности са обърнати, така че когато вашият потенциометър е докрай надясно, получавате отрицателна стойност за вашата променлива Mapped Pot, възможно е вашият потенциометър да бъде настроен по грешен начин. За щастие, можете да поправите това, без да правите преокабеляване. Можете просто да превключите стойностите, когато ги пренастроите:

Сега най -накрая имаме използваеми стойности. Сега остава само да присвоим тези стойности на позицията на нашата сфера X:

как да създам имейл адрес за себе си
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Запазете скрипта си, върнете се в редактора на Unity и натиснете play. Вече би трябвало да можете да премествате сферата си наляво и надясно с помощта на вашия потенциометър!

Поставяне на бутона на работа

Сега, когато нашата сфера се движи, не би ли било хубаво да имаме начин да забавим нещата малко, когато попаднем в трудно положение? Ще използваме нашия бутон, за да забавим времето в нашата игра. Отворете вашия scriptMover скрипт и добавете този код към функцията си 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;

Сега имаме механиката на нашата игра, нека добавим някои пречки! Ще използваме естествения враг на сферата, куба. В йерархията щракнете Създаване> 3D обект> Куб . В инспектора на куба, Добавете компонент> Физика> Твърдо тяло . Задайте стойността на плъзгане на твърдото тяло на 5. Също така, под компонента Box Collider в инспектора, изберете Is Trigger. Това ще ни позволи да открием сблъсъци с нашата Сфера.

Създайте скрипт на куба и го извикайте collideWithSphere , отворете скрипта и изтрийте функциите Start и Update, тъй като този път няма да имаме нужда от тях. Въведете този код:

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

OnTriggerEnter изпраща съобщение всеки път, когато спусъковият коллайдер удари друг колайдер. В този случай ние му казваме да унищожи всичко, до което се докосне. Запазете скрипта и се върнете към редактора Unity. Плъзнете куба от йерархията към панела Project. Ще забележите, че текстът на куба в йерархията е станал син. Това е така, защото ние създадохме сглобяем и го запазихме в нашия проект. Изтрийте куба си от йерархията сега.

Всичко, от което се нуждаем сега, е скрипт за хвърляне на кубчета. В йерархията щракнете Създай> Създай празно и го преименувайте на Game Manager в Inspector и добавете към него скрипт, наречен gameManager. Отворете скрипта и добавете този код:

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 ()
{

}
}

Запазете скрипта. Върнете се в редактора, изберете диспечера на игрите в йерархията и плъзнете сглобяемия си куб от панела на проекта към променливата Cube в Инспектора. Попълнете стойностите за вашия хайвер също тук. Можете да се занимавате с него, за да стане толкова трудно или лесно, колкото искате. Обърнете внимание, че си струва най -ниските ви кубчета да се появят достатъчно високо, за да позволят на Uniduino да инициализира - загубата на играта, преди да можете да се движите, може да бъде разочароваща!

Готовият проект

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

В този проект ние създадохме персонализиран контролер с Arduino, конфигурирахме Unity и Uniduino да комуникират с него и създадохме проста игра, за да го тестваме. Концепциите тук могат да бъдат приложени към почти всеки проект, а дори има конфитюри за игри, специализирани в персонализирани контролери .

С Arduino и Unity можете да създадете персонализиран контролер от почти всичко. Създали ли сте hi-fi, който контролира космически кораб? Тостер, който контролира игра на платформа?

Ако сте направили такъв проект, ще се радвам да го видя! Публикувайте го в коментарите по -долу!

Дял Дял Туит електронна поща 6 Звукови алтернативи: Най -добрите безплатни или евтини приложения за аудиокниги

Ако не искате да плащате за аудиокниги, ето няколко страхотни приложения, които ви позволяват да ги слушате безплатно и законно.

Прочетете Напред
Свързани теми
  • Направи си сам
  • Програмиране
  • Arduino
  • Контролер за игри
  • Разработка на игри
За автора Иън Бъкли(216 статии са публикувани)

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

Още от Иън Бъкли

Абонирайте се за нашия бюлетин

Присъединете се към нашия бюлетин за технически съвети, рецензии, безплатни електронни книги и изключителни оферти!

Щракнете тук, за да се абонирате