Как создать собственный игровой контроллер с помощью Arduino и Unity

Как создать собственный игровой контроллер с помощью Arduino и Unity

Вы когда-нибудь хотели создать свой собственный игровой контроллер? Это проще, чем вы думаете!





В этом небольшом проекте мы создадим простой пользовательский игровой контроллер для использования с игровым движком Unity. Этот контроллер будет питаться от Arduino Uno, хотя вы также можете использовать одну из многих альтернатив для этого проекта. Мы также создадим базовую игру, в которой вы будете использовать свой контроллер, чтобы избегать падающих предметов и замедлять время.





Для этого проекта вам понадобится

  • Arduino или аналогичный микроконтроллер
  • 1 резистор 10 кОм
  • 1 х мгновенный переключатель
  • 1 х потенциометр
  • Монтажные провода
  • Макет
  • Игровой движок Unity
  • Плагин Uniduino от Unity Asset Store (30 долларов США)
  • Полный код проекта, если вы не хотите его писать (не включает плагин Uniduino)

Большинство из этих вещей доступно в стартовом наборе Arduino. Если у вас нет стартового набора, ознакомьтесь с нашим руководством по выбору лучшего для вас.





Вы можете сделать свой контроллер настолько сложным, насколько захотите, хотя для этого примера мы настроим потенциометр и кнопку - идеально подходят для управления простой аркадной игрой.

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

Настройте макет и Arduino, как показано на изображении ниже. Это то, что мы будем использовать в качестве нашего игрового контроллера, хотя вы можете использовать почти ту же настройку, что и Миди-контроллер своими руками тоже!



Подготовка вашего Arduino

После того, как вы все подключили, подключите Arduino через USB. В Arduino Software IDE перейдите в Инструменты> Доска а также Инструменты> Порт для выбора используемого микроконтроллера и порта. IDE Arduino поставляется в комплекте с нужным нам скетчем, и вы можете найти его в Файл> Примеры> Фирмы> StandardFirmata . Нажмите «Загрузить», и все будет готово.

Если вы новичок в Arduino и у вас немного тает голова, ознакомьтесь с нашим Руководство для начинающих чтобы помочь вам заставить его нормально разговаривать с вашим компьютером.





Настройка вашего проекта Unity

В Unity откройте Окно> Магазин активов для доступа к Unity Asset Store из редактора Unity. Найдите в Asset Store плагин Uniduino. Этот плагин позволит вам получать и отправлять данные на ваши контакты Arduino и с них внутри Unity. Плагин на момент написания стоит 30 долларов. Возможно сделать этот проект, не покупая плагин, хотя это намного сложнее, и вы можете найти плагин более удобным во всех отношениях.

Это видео от создателей плагина проведет вас через процесс проверки того, что все работает, а также через первоначальную настройку. Обратите внимание, что вам также может потребоваться сбросить редактор Unity в Windows.





Мы можем использовать эту же тестовую панель для тестирования нашего контроллера. Установите контакт D2 на INPUT и Digital. Далее установите контакт A5 на АНАЛОГОВЫЙ. Теперь ваш потенциометр и кнопка должны отображать значения на экране рядом с их номерами контактов. Прогресс!

Теперь, чтобы сделать то, что мы можем контролировать

Итак, у нас есть контроллер, но что мы будем контролировать? Что ж, возможности безграничны, но сегодня мы создадим очень простую игру с уклонениями, чтобы протестировать нашу новую систему управления. Мы довольно быстро перейдем к настройке игры, поэтому, если вы новичок в движке Unity, вы можете найти наш Руководство по программированию игр на Unity для начинающих полезно ориентироваться.

Мы создадим очень простую игру, в которой ваша цель - уворачиваться от сферы влево и вправо, чтобы избежать падения кубиков, в которой будет использоваться ваш недавно созданный пользовательский контроллер.

Создайте новую сцену и перетащите префаб Uniduino из Активы> Uniduino> Сборные в свою иерархию и перетащите префаб Uniduino в иерархию. Он нужен нам, чтобы разговаривать между нашей игрой и контроллером.

В иерархии Unity щелкните Создать> Сфера и используйте вкладку «Преобразование» в Инспекторе, чтобы переместить ее в нижнюю часть игрового экрана.

Пришло время заняться программированием

Теперь добавим код к этой партии. Выбрав сферу в Иерархии, щелкните Добавить компонент> Новый сценарий в нижней части окна инспектора. Назови это сфера и выберите C Sharp из раскрывающегося меню. Нажмите Создать и добавить и сценарий будет добавлен в 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 и посмотрим, что изменилось.

Теперь мы можем видеть наши общедоступные переменные в окне инспектора. Давайте посмотрим, что мы можем ввести на этом этапе, чтобы помочь нам позже. Мы знаем, какие контакты мы используем на Arduino из нашей предыдущей сборки, мы можем ввести их. Мы также знаем из нашего эксперимента ранее, как далеко мы хотим, чтобы наша сфера могла перемещаться влево и вправо, чтобы она не упала с экрана. Теперь давайте введем эти значения.

Первые признаки жизни

Пришло время действительно увидеть значения из нашего Arduino в редакторе Unity. На данный момент мы можем добавить одну строку кода в функцию обновления нашего скрипта 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 и проверьте его имя порта в инспекторе. Если он пуст, введите правильный номер порта для вашего Arduino. В данном случае это был COM4, ​​хотя для вас он может быть другим. Если вы не уверены, используйте IDE Arduino.

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

Теперь мы говорим! Ну, собственно говоря, Unity и Arduino разговаривают, но кто считает? Если вы зашли так далеко и не видите изменения значения в инспекторе, проверьте шаги настройки и убедитесь, что для вашего Arduino выбран правильный порт.

Давайте переместим эту сферу

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

Мы хотим повлиять на положение сферы по оси X. К сожалению, использование значений из нашего потенциометра напрямую не сработает, так как, когда потенциометр полностью влево, он дает значение 0, что помещает нашу сферу прямо посередине экрана. С другой стороны, верхнее значение потенциометра, 1023, поместило бы куб далеко вправо от нашего экрана. Не полезно. Что нам здесь нужно, так это математика.

Зачем заниматься математикой, если Unity сделает это за вас?

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

Метод расширения - это сценарий, который выполняет за нас определенную работу. В этом случае мы даем ему те значения, которые у нас есть, и он возвращает их, сопоставленные друг с другом, готовые к использованию в нашем сфера сценарий. Вверху панели «Проект» щелкните Создать> Сценарий 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;
}
}

Сохраните скрипт и вернитесь к своему скрипту SphereMover. Теперь мы можем использовать эту функцию Remap в нашем скрипте ExtensionMethods в нашей функции Update, чтобы преобразовать наши значения потенциометра в используемые значения в нашей игре. Под тем местом, где мы только что присвоили переменную potValue, введите следующее:

Приглашение показывает нам, что наша Remap принимает два набора значений From и To и сопоставляет их вместе. Мы можем внести в это наши ценности.

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

Сохраните сценарий, вернитесь в редактор Unity и нажмите кнопку воспроизведения. Теперь вы должны увидеть, что переменная Mapped Pot изменяется при перемещении потенциометра, чтобы соответствовать значениям, которые мы определили для наших левого и правого краев. Найдите минутку, чтобы расслабиться и поблагодарить свой сценарий ExtensionMethods. Калькулятора не видно.

Примечание: если вы заметили, что ваши значения поменялись местами, поэтому, когда ваш потенциометр полностью повернут вправо, вы получаете отрицательное значение для вашей переменной Mapped Pot, возможно, ваш потенциометр настроен неправильно. К счастью, это можно исправить, не меняя проводку. Вы можете просто переключать значения при их переназначении:

Теперь у нас наконец-то есть полезные ценности. Теперь все, что осталось сделать, это присвоить эти значения позиции X нашей сферы:

raspberry pi 3b против 3b +
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Сохраните свой сценарий, вернитесь в редактор Unity и нажмите кнопку воспроизведения. Теперь вы можете перемещать свою Сферу влево и вправо с помощью потенциометра!

Запускаем кнопку в работу

Теперь, когда наша сфера движется, было бы неплохо иметь способ немного замедлить работу, когда мы попадаем в затруднительное положение? Мы собираемся использовать нашу кнопку, чтобы замедлить время в нашей игре. Откройте свой сценарий SphereMover и добавьте этот код в функцию обновления.

//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-объект> Куб . В инспекторе куба Добавить компонент> Физика> Жесткое тело . Установите значение Drag для твердого тела на 5. Также под компонентом Box Collider в инспекторе выберите Is Trigger. Это позволит нам обнаруживать столкновения с нашей Сферой.

Создайте скрипт на кубе и назовите его collideWithSphere , откройте скрипт и удалите функции «Пуск» и «Обновление», поскольку на этот раз они нам не понадобятся. Введите этот код:

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

OnTriggerEnter отправляет сообщение всякий раз, когда коллайдер триггера сталкивается с другим коллайдером. В этом случае мы говорим ему уничтожать все, к чему он прикасается. Сохраните скрипт и вернитесь в редактор Unity. Перетащите куб из иерархии на панель «Проект». Вы заметите, что текст куба в иерархии стал синим. Это потому, что мы создали префаб и сохранили его в нашем проекте. Удалите свой куб из иерархии сейчас.

Все, что нам сейчас нужно, это скрипт для создания кубов. В иерархии щелкните Создать> Создать пустой , и переименуйте его в Game Manager в Инспекторе и добавьте к нему сценарий с именем 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 ()
{

}
}

Сохраните сценарий. Вернувшись в редактор, выберите Game Manager в иерархии и перетащите префаб куба с панели проекта на переменную Cube в инспекторе. Здесь также укажите значения для своего нереста. Вы можете возиться с ним, чтобы сделать его настолько сложным или легким, насколько захотите. Обратите внимание, что ваши самые маленькие кубы должны появляться достаточно высоко, чтобы Uniduino могла инициализироваться - проигрыш в игре до того, как вы сможете двигаться, может вас расстроить!

Готовый проект

Теперь, когда вы нажимаете кнопку воспроизведения, кубики появляются над вами и падают. Вы можете использовать свой потенциометр, чтобы избежать их, и кнопку, чтобы замедлить время.

В этом проекте мы создали настраиваемый контроллер с Arduino, настроили Unity и Uniduino для связи с ним и создали простую игру для тестирования. Представленные здесь концепции могут быть применены практически к любому проекту, и есть даже игровые джемы, специализирующиеся на пользовательских контроллерах .

С Arduino и Unity вы можете создать собственный контроллер практически из чего угодно. Вы создали систему Hi-Fi, которая управляет космическим кораблем? Тостер, управляющий платформером?

Если вы сделали такой проект, я бы хотел его увидеть! Разместите это в комментариях ниже!

Делиться Делиться Твитнуть Эл. адрес 6 звуковых альтернатив: лучшие бесплатные или дешевые аудиокниги

Если вы не хотите платить за аудиокниги, вот несколько отличных приложений, которые позволяют вам слушать их бесплатно и легально.

Читать далее
Похожие темы
  • Сделай сам
  • Программирование
  • Ардуино
  • Игровой контроллер
  • Разработка игр
Об авторе Ян Бакли(Опубликовано 216 статей)

Ян Бакли - независимый журналист, музыкант, исполнитель и видеопродюсер, живущий в Берлине, Германия. Когда он не пишет или на сцене, он возится с электроникой или кодом своими руками в надежде стать безумным ученым.

Ещё от Ian Buckley

Подписывайтесь на нашу новостную рассылку

Подпишитесь на нашу рассылку технических советов, обзоров, бесплатных электронных книг и эксклюзивных предложений!

Нажмите здесь, чтобы подписаться