Оглавление:

Как создать многопользовательскую игру с контроллерами Arduino: 6 шагов
Как создать многопользовательскую игру с контроллерами Arduino: 6 шагов

Видео: Как создать многопользовательскую игру с контроллерами Arduino: 6 шагов

Видео: Как создать многопользовательскую игру с контроллерами Arduino: 6 шагов
Видео: Уроки Arduino. Расширенное управление кнопкой 2024, Июль
Anonim
Как создать многопользовательскую игру с контроллерами Arduino
Как создать многопользовательскую игру с контроллерами Arduino

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

Запасы

Тебе понадобится:

  • Ноутбук
  • Unity Engine
  • C # IDE, которая работает с Unity, например Visual Studio или Atom. (Я буду использовать код Visual Studio)
  • 2X Arduino Nano
  • 2X большая хлебная доска
  • 2X Маленькая хлебная доска
  • 4X переключатель прихвата (кнопка)
  • Резистор 4X 200 Ом
  • 12x перемычек между мужчинами
  • IDE Arduino

Будет полезно, если у вас есть базовые представления об использовании Unity, однако это не повлияет на ваш прогресс, так как вы познакомитесь с ним в процессе создания игры.

Ссылка для скачивания 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

Как только это будет сделано, вы можете приступить к настройке представления игры.

Откройте новый проект Unity, назовите его и выберите 2D-игру.

Когда проект откроется, обратите внимание, что есть 3 основных раздела, которые называются

  • Иерархия (сюда будут добавлены все ваши игровые объекты и детали).
  • Сцена (где вы настраиваете вид игры).
  • Игра (где вы можете проверить, как будет проходить настоящая игра).

Обратите внимание, что под иерархией находится ваша сцена, а под сценой - «Основная камера». Когда вы выбираете камеру из иерархии, она будет выбрана в сцене.

(Все, что находится в пределах этой камеры, будет отображаться в реальной игре).

Посмотрите на картинку 1

Наша игра состоит из двух досок, шара, который движется, и границ, ограничивающих движение досок и мяча.

Начнем с создания границ.

  1. Чтобы создать новый игровой объект, выберите Assets> Create> Sprites> square (назовите его «правая и левая границы»). Посмотрите на рисунок 2.
  2. Перетащите правую и левую границы иерархии, и на сцене появится квадрат.
  3. Отрегулируйте его положение по оси x на (5) «правая и левая границы»> инспектор> преобразование> положение> X. Посмотрите на картинку 3
  4. Затем отрегулируйте масштаб так, чтобы он перекрывал границы камеры (перетащите верхнюю и нижнюю стороны квадрата, чтобы растянуть его).
  5. Отрегулируйте его цвет «от правой и левой границ»> инспектор> рендеринг спрайта> цвет. Посмотрите на картинку 3
  6. Прокрутите вниз в инспекторе и выберите «Добавить компонент», затем введите Rigidbody2D и нажмите «Ввод», это в основном добавит физику вашему игровому объекту, поскольку придаст ему массу, гравитацию и обнаружение столкновений. Однако нам не нужна гравитация в нашей игре, поэтому сделайте гравитацию равной 0 вместо 1. Вам также нужно будет зафиксировать положение и вращение, чтобы граница не двигалась при столкновении. Посмотрите на картинку 4
  7. выберите «Добавить компонент», затем введите «Box Collider 2D» и нажмите «Ввод». Это добавит область вокруг игрового объекта, в которой могут быть обнаружены столкновения. Посмотрите на картинку 4
  8. Теперь выберите правую и левую границы и нажмите (ctrl + d), чтобы продублировать ее.
  9. Назовите его «левая граница» и переименуйте первый («правая граница»).
  10. Выберите левую границу и отрегулируйте ее положение по оси x на (-5), как в шаге 3. Теперь у вас есть правая и левая границы.

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

Посмотрите на картинку 5

Шаг 2: Добавление плат и создание контроллеров

Добавление плат и изготовление контроллеров
Добавление плат и изготовление контроллеров
Добавление плат и изготовление контроллеров
Добавление плат и изготовление контроллеров
Добавление плат и изготовление контроллеров
Добавление плат и изготовление контроллеров

Добавление плат

Создайте новый игровой объект и назовите его player 1.

Регулировать:

  • Масштаб: X (1,2), Y (0,15), Z (1)
  • Позиция: X (0), Y (-3,6), z (0)
  • Добавить BoxCollider2D
  • Добавьте Rigidbody 2D и зафиксируйте оси y и z.

Дублируйте (ctrl + d) и переименуйте копию player 2.

Регулировать:

  • Масштаб: X (1,2), Y (0,15), Z (1)
  • Позиция: X (0), Y (3,6), z (0)
  • BoxCollider уже будет там.
  • Rigidbody 2D уже будет там, а оси y и z будут уже заморожены.

Посмотрите на картинку 1

Изготовление контроллеров

Тебе понадобится:

  • 2X Arduino Nano
  • 2X большая хлебная доска
  • 2X Маленькая хлебная доска
  • 4X переключатель прихвата (кнопка)
  • 4X резистор
  • 12x перемычек между мужчинами

Теперь посмотрите фотографии макета и картографию для сборки джойстиков.

  1. Присоедините один чип Arduino Nano к небольшой макетной плате.
  2. прикрепите 2 переключателя прихватки к большой макетной плате, как показано на рисунке. Старайтесь, чтобы правая сторона макета была симметричной левой, так как это улучшит внешний вид джойстика (вы можете использовать 30-й столбец в качестве симметрии линия)
  3. Соедините верхний левый контакт левой кнопки с контактом 5V в Arduino на маленькой макетной плате (то, что связано с одним и тем же столбцом на макетной плате, соединено друг с другом).
  4. Соедините верхний правый контакт правой кнопки с контактом 5V на Arduino.
  5. Соедините нижний правый контакт левой кнопки с точкой на 31-й колонке с помощью резистора.
  6. Соедините нижний левый контакт правой кнопки с точкой на 29-м столбце с помощью резистора.
  7. Подключите резисторы к контакту GND в Arduino.
  8. Соедините верхний правый контакт левой кнопки с контактом D3 в Arduino.
  9. Соедините верхний левый контакт правой кнопки с контактом D9 в Arduino.
  10. Теперь повторите эти шаги и сделайте второй контроллер.

Шаг 3: Подключение Arduino к последовательному порту

Подключение Arduino к последовательному порту
Подключение Arduino к последовательному порту
Подключение Arduino к последовательному порту
Подключение Arduino к последовательному порту
Подключение Arduino к последовательному порту
Подключение Arduino к последовательному порту
Подключение Arduino к последовательному порту
Подключение Arduino к последовательному порту

Сначала вам нужно установить IDE Arduino.

После их установки вы можете начать с создания программы Arduino, которая получает входные данные от кнопок и сохраняет их в последовательном порту (COM-порту). Когда плата Arduino подключена к вашему ноутбуку, операционная система автоматически распознает плату как последовательный порт, в который можно загружать программы. Значения, хранящиеся в последовательном порту, можно использовать на следующем шаге, когда мы подключаем Unity Engine к последовательному порту.

Теперь давайте подключим Arduino к последовательному порту.

Посмотри на картинки

  1. Подключите Arduino к ноутбуку
  2. Инструменты> Плата> Arduino Nano
  3. Если у вас новейший чип Arduino (2018-2020) Инструменты> Процессор> ATmega328P (старый загрузчик).
  4. Если у вас не новый чип Arduino (до 2018 г.) Инструменты> Процессор> ATmega328P
  5. Инструменты> Порт> COM (какое бы число ни появилось, в моем случае это 10). * Это последовательный порт, в котором будут храниться значения.
  6. Скопируйте код и вставьте его в IDE Arduino и нажмите ctrl + u, чтобы загрузить программу.
  7. Повторите со вторым Arduino. (при выполнении шага 5 обязательно выберите другой COM-порт, чтобы оба контроллера не были подключены к одному и тому же последовательному порту).

Код:

void setup () {

Serial.begin (9600); pinMode (3, ВХОД); // Сообщаем Arduino о получении ввода от вывода D3 pinMode (9, INPUT); // Сообщаем Arduino о получении ввода от вывода D9} void loop () {if (digitalRead (3) == 1) {/ * Если Arduino получает ввод 1 Serial.write (1); с контакта 3 Вывести значение 1 в последовательный порт Serial.flush (); * / задержка (2); } if (digitalRead (9) == 1) {/ * Если Arduino получает ввод 1 Serial.write (2); с вывода 9 Вывести значение 2 в последовательный порт Serial.flush (); * / задержка (2); }}

Пояснение к программе:

Этот код просто принимает входные данные от контактов D3 и D9 в Arduino, которые подключены к кнопкам. Кнопки либо нажаты, либо не нажаты, что означает, что считываемые с них показания равны 1 (нажатие) или 0 (не нажатие). Если ввод от правой кнопки (с D9) равен 1 (нажато), сохраните значение 1 в последовательном порту. Если ввод от левой кнопки (от D3) равен 1 (нажато), сохраните значение 2 в последовательном порту.

Шаг 4: Подключение Unity к последовательному порту

Подключение Unity к последовательному порту
Подключение Unity к последовательному порту
Подключение Unity к последовательному порту
Подключение Unity к последовательному порту

На этом этапе мы собираемся идентифицировать последовательный порт в Unity, чтобы он мог получать входные данные от Arduino при нажатии кнопок. Установите Visual Studio Code на свой ноутбук. Затем перейдите в Unity, выберите игрока 1 в иерархии, прокрутите вниз и выберите добавить компонент, введите player1_motion и нажмите Enter. Посмотрите на картинку 1

Сценарий C # будет создан в инспекторе, щелкните его правой кнопкой мыши и выберите сценарий редактирования, код Visual Studio должен открыться и отобразить код по умолчанию, который выглядит как изображение 2.

Скопируйте следующий код и измените "SerialPort sp = new SerialPort (" COM10 ", 9600);" с SerialPort sp = new SerialPort («COM-порт, к которому подключен ваш Arduino», 9600); вы можете найти его, вернувшись к своему коду Arduino и выбрав Инструменты> Порт> COM (какой бы номер ни появился).

Код:

using System. Collections;

using System. Collections. Generic; using UnityEngine; используя System. IO. Ports; открытый класс player1_motion: MonoBehaviour {скорость плавания = 8; объем частного обращения; SerialPort sp = новый SerialPort ("COM10", 9600); // Start вызывается перед обновлением первого кадра void Start () {sp. Open (); sp. ReadTimeout = 1; } // Обновление вызывается один раз за кадр void Update () {amounttomove = speed * 0.01f; если (sp. IsOpen) {попробуйте {moveObject (sp. ReadByte ()); печать (sp. ReadByte ()); } catch (System. Exception) {}}} void moveObject (int Direction) {if (Direction == 1) {transform. Translate (Vector3.left * amounttomove, Space. World); } if (Direction == 2) {transform. Translate (Vector3.right * amounttomove, Space. World); }}}

Объяснение кода:

Этот код сообщает Unity о приеме входных сигналов от последовательного порта (COM 10). При нажатии левой кнопки Arduino отправляет значение 1 в последовательный порт, если единица получает 1 из последовательного порта, к игровому объекту «player 1» в левом направлении добавляется скорость. При нажатии правой кнопки Arduino отправляет значение 2 в последовательный порт, если единица получает 2 из последовательного порта, к игровому объекту «player 1» добавляется скорость в правильном направлении. если последовательный порт не получает значение от последовательного порта, скорость не добавляется ни в одном из направлений, поэтому плата остается неподвижной.

После копирования кода нажмите F5, чтобы построить и запустить код. Вернитесь к единству и нажмите кнопку воспроизведения, игрок 1 должен двигаться вправо, когда вы нажимаете вправо, и влево, когда вы нажимаете влево.

Теперь повторите те же шаги еще раз, но с проигрывателем 2, и убедитесь, что в поле «Добавить компонент» вы указали player2_motion вместо player1_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. Перейдите в Assets> Create> Physics material 2D Посмотрите на картинку 1.
  10. измените его название на "отказов"
  11. Меняем трение на ноль с инспектора
  12. Измените bounciness на 1 в инспекторе
  13. Перетащите "bounce" в Rigidbody 2D> Material. Посмотрите на картинку 2.
  14. Снова выберите «мяч» в иерархии и перейдите к добавлению компонента и введите Ball_movement, затем нажмите Enter.
  15. Щелкните сценарий правой кнопкой мыши и выберите команду редактирования сценария.
  16. Скопируйте приведенный ниже код и нажмите F5, чтобы собрать и запустить его.

Код:

using System. Collections;

using System. Collections. Generic; using UnityEngine; public class Ball_movement: MonoBehaviour {// Start вызывается перед обновлением первого кадра private float force = 2; void Start () {StartCoroutine (перемещение ()); } IEnumerator move () {yield return new WaitForSeconds (2); GetComponent (). AddForce (новый Vector2 (1f, 0.5f) * 0.02f * force); }}

Пояснение кода

Этот код дает мячу скорость в обоих направлениях - направлении X и направлении Y с одинаковой величиной, что заставляет мяч двигаться под углом 45 °. На шаге 8 мы добавили к мячу физический материал и изменили его упругость, это поддерживает движение мяча на протяжении всей игры.

Шаг 6: Завершение игры

Завершение игры
Завершение игры
Завершение игры
Завершение игры
Завершение игры
Завершение игры
Завершение игры
Завершение игры

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

  1. Перетащите мяч из Иерархии в Проект. Вы создали сборный мяч, чтобы использовать его позже.
  2. Щелкните правой кнопкой мыши по иерархии и выберите «Создать пустой». появится пустой объект, переименуйте его в возрождение шара и измените его положение, чтобы оно совпадало с положением шара.
  3. Щелкните правой кнопкой мыши иерархию и выберите UI >> Текст. Обратите внимание, что текст сопровождает холст. Положение текста в игре зависит от положения текста на холсте, а не в границах нашей игры. (Посмотрите на картинку 1).
  4. Измените положение текста так, как хотите.
  5. Повторите шаги 3 и 4 еще раз для счета второго игрока.
  6. Введите первый текст «Оценка игрока 1: 0» и введите второй текст «Оценка игрока 2: 0». (Посмотрите на картинку 2).
  7. Создайте сценарий p1wins на верхней границе и скопируйте следующий код.

Код:

using System. Collections;

using System. Collections. Generic; using UnityEngine; с использованием UnityEngine. SceneManagement; с использованием UnityEngine. UI; публичный класс p1wins: MonoBehaviour {общедоступный текстовый балл; общественное преобразование ball_respawn; публичный GameObject ball; частный int p1 = 0; // Start вызывается перед первым кадром update void Start () {} // Обновление вызывается один раз за кадр void Update () {score.text = "Player 1 Score:" + p1; } void OnCollisionEnter2D (Collision2D other) {if (other.gameObject.tag == "Ball") {Destroy (other.gameObject); p1 ++; Создать экземпляр (мяч, ball_respawn.position, ball_respawn.rotation); }}}

8. Перетащите префаб шара из проекта на шаге 1 в параметр Ball. (Посмотрите на картинку 3)

9. Перетащите возрождение мяча из иерархии в параметр Возрождение мяча. (Посмотрите на картинку 3)

10. перетащите счет игрока 1 из иерархии в параметр Score. (Посмотрите на картинку 3)

Объяснение кода:

Когда мяч сталкивается с верхней границей, он разрушается и снова возрождается в позиции ball_respawn, которую мы назначили на шаге 2. Цель создания шара - это возможность возродить его со всеми его функциями, в противном случае, если мы использовали мяч из иерархии он возродится, но не будет двигаться. Также, когда мяч сталкивается с верхней границей, значение, изначально равное 0, называемое p1, увеличивается на 1. это значение отображается в виде текста, поэтому, когда мяч сталкивается с верхней границей, счет для игрока 1 увеличивается на 1.

Теперь выполните шаги 7, 8, 9 и 10 для нижней границы.

для шага 7 создайте сценарий с именем p2wins и скопируйте вместо него следующий код.

для шага 10 перетащите счет игрока 2 из иерархии в параметр Score.

Код:

using System. Collections;

using System. Collections. Generic; using UnityEngine; с использованием UnityEngine. SceneManagement; с использованием UnityEngine. UI; публичный класс p2wins: MonoBehaviour {общедоступный текстовый счет; общественное преобразование ball_respawn; публичный GameObject ball; частный int p2 = 0; // Start вызывается перед первым кадром update void Start () {} // Обновление вызывается один раз за кадр void Update () {score.text = "Player 2 Score:" + p2; } void OnCollisionEnter2D (Collision2D other) {if (other.gameObject.tag == "Ball") {Destroy (other.gameObject); p2 ++; Создать экземпляр (мяч, ball_respawn.position, ball_respawn.rotation); }}}

Рекомендуемые: