Оглавление:
- Запасы
- Шаг 1. Настройте границы игры
- Шаг 2: Добавление плат и создание контроллеров
- Шаг 3: Подключение Arduino к последовательному порту
- Шаг 4: Подключение Unity к последовательному порту
- Шаг 5: добавление мяча
- Шаг 6: Завершение игры
Видео: Как создать многопользовательскую игру с контроллерами Arduino: 6 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:48
Вы когда-нибудь задумывались, как разработчики игр создают удивительные игры, в которые люди во всем мире любят играть? Что ж, сегодня я собираюсь дать вам небольшую подсказку об этом, создав небольшую многопользовательскую игру, которая будет управляться контроллером 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
Наша игра состоит из двух досок, шара, который движется, и границ, ограничивающих движение досок и мяча.
Начнем с создания границ.
- Чтобы создать новый игровой объект, выберите Assets> Create> Sprites> square (назовите его «правая и левая границы»). Посмотрите на рисунок 2.
- Перетащите правую и левую границы иерархии, и на сцене появится квадрат.
- Отрегулируйте его положение по оси x на (5) «правая и левая границы»> инспектор> преобразование> положение> X. Посмотрите на картинку 3
- Затем отрегулируйте масштаб так, чтобы он перекрывал границы камеры (перетащите верхнюю и нижнюю стороны квадрата, чтобы растянуть его).
- Отрегулируйте его цвет «от правой и левой границ»> инспектор> рендеринг спрайта> цвет. Посмотрите на картинку 3
- Прокрутите вниз в инспекторе и выберите «Добавить компонент», затем введите Rigidbody2D и нажмите «Ввод», это в основном добавит физику вашему игровому объекту, поскольку придаст ему массу, гравитацию и обнаружение столкновений. Однако нам не нужна гравитация в нашей игре, поэтому сделайте гравитацию равной 0 вместо 1. Вам также нужно будет зафиксировать положение и вращение, чтобы граница не двигалась при столкновении. Посмотрите на картинку 4
- выберите «Добавить компонент», затем введите «Box Collider 2D» и нажмите «Ввод». Это добавит область вокруг игрового объекта, в которой могут быть обнаружены столкновения. Посмотрите на картинку 4
- Теперь выберите правую и левую границы и нажмите (ctrl + d), чтобы продублировать ее.
- Назовите его «левая граница» и переименуйте первый («правая граница»).
- Выберите левую границу и отрегулируйте ее положение по оси 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 перемычек между мужчинами
Теперь посмотрите фотографии макета и картографию для сборки джойстиков.
- Присоедините один чип Arduino Nano к небольшой макетной плате.
- прикрепите 2 переключателя прихватки к большой макетной плате, как показано на рисунке. Старайтесь, чтобы правая сторона макета была симметричной левой, так как это улучшит внешний вид джойстика (вы можете использовать 30-й столбец в качестве симметрии линия)
- Соедините верхний левый контакт левой кнопки с контактом 5V в Arduino на маленькой макетной плате (то, что связано с одним и тем же столбцом на макетной плате, соединено друг с другом).
- Соедините верхний правый контакт правой кнопки с контактом 5V на Arduino.
- Соедините нижний правый контакт левой кнопки с точкой на 31-й колонке с помощью резистора.
- Соедините нижний левый контакт правой кнопки с точкой на 29-м столбце с помощью резистора.
- Подключите резисторы к контакту GND в Arduino.
- Соедините верхний правый контакт левой кнопки с контактом D3 в Arduino.
- Соедините верхний левый контакт правой кнопки с контактом D9 в Arduino.
- Теперь повторите эти шаги и сделайте второй контроллер.
Шаг 3: Подключение Arduino к последовательному порту
Сначала вам нужно установить IDE Arduino.
После их установки вы можете начать с создания программы Arduino, которая получает входные данные от кнопок и сохраняет их в последовательном порту (COM-порту). Когда плата Arduino подключена к вашему ноутбуку, операционная система автоматически распознает плату как последовательный порт, в который можно загружать программы. Значения, хранящиеся в последовательном порту, можно использовать на следующем шаге, когда мы подключаем Unity Engine к последовательному порту.
Теперь давайте подключим Arduino к последовательному порту.
Посмотри на картинки
- Подключите Arduino к ноутбуку
- Инструменты> Плата> Arduino Nano
- Если у вас новейший чип Arduino (2018-2020) Инструменты> Процессор> ATmega328P (старый загрузчик).
- Если у вас не новый чип Arduino (до 2018 г.) Инструменты> Процессор> ATmega328P
- Инструменты> Порт> COM (какое бы число ни появилось, в моем случае это 10). * Это последовательный порт, в котором будут храниться значения.
- Скопируйте код и вставьте его в IDE Arduino и нажмите ctrl + u, чтобы загрузить программу.
- Повторите со вторым 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, чтобы он мог получать входные данные от 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: добавление мяча
- Добавьте новый игровой объект, но на этот раз выберите круг вместо квадрата.
- Назовите его "мяч".
- Перетащите в иерархию.
- Отрегулируйте масштаб (X: 0,2 - Y: 0,2 - Z: 0,2).
- Добавьте Rigidbody 2D и зафиксируйте только ось Z.
- Измените массу на 0,0001
- Измените Gravity Scale на 0.
- Добавьте Box Collider 2D.
- Перейдите в Assets> Create> Physics material 2D Посмотрите на картинку 1.
- измените его название на "отказов"
- Меняем трение на ноль с инспектора
- Измените bounciness на 1 в инспекторе
- Перетащите "bounce" в Rigidbody 2D> Material. Посмотрите на картинку 2.
- Снова выберите «мяч» в иерархии и перейдите к добавлению компонента и введите Ball_movement, затем нажмите Enter.
- Щелкните сценарий правой кнопкой мыши и выберите команду редактирования сценария.
- Скопируйте приведенный ниже код и нажмите 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, он просто отскакивает от границы, а это не совсем то, что нам нужно в нашей игре. Вместо этого мы хотим создать счетчик очков, который будет подсчитывать очки каждый раз, когда мяч сталкивается либо с верхней, либо с нижней границей, и сбрасывать положение мяча.
- Перетащите мяч из Иерархии в Проект. Вы создали сборный мяч, чтобы использовать его позже.
- Щелкните правой кнопкой мыши по иерархии и выберите «Создать пустой». появится пустой объект, переименуйте его в возрождение шара и измените его положение, чтобы оно совпадало с положением шара.
- Щелкните правой кнопкой мыши иерархию и выберите UI >> Текст. Обратите внимание, что текст сопровождает холст. Положение текста в игре зависит от положения текста на холсте, а не в границах нашей игры. (Посмотрите на картинку 1).
- Измените положение текста так, как хотите.
- Повторите шаги 3 и 4 еще раз для счета второго игрока.
- Введите первый текст «Оценка игрока 1: 0» и введите второй текст «Оценка игрока 2: 0». (Посмотрите на картинку 2).
- Создайте сценарий 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); }}}
Рекомендуемые:
Как создать микробитную игру: 7 шагов
Как создать игру Microbit: Hai pals, В этом уроке я научу вас, как создать игру в tinkercad, используя новый специальный компонент Microbit
Как создать игру в покер на Java: 4 шага
Как создать игру в покер на Java: Это руководство предназначено для тех, кто уже кое-что знает Java и хочет создать игру в покер на Java. Прежде всего, вам понадобится компьютер с каким-либо приложением для программирования или веб-сайт, позволяющий использовать Java. Я рекомендую использовать DrJ
Как создать загрузочный диск Linux (и как его использовать): 10 шагов
Как создать загрузочный диск Linux (и как его использовать): это простое введение о том, как начать работу с Linux, в частности с Ubuntu
Введение в робототехнику для учеников начальной школы с контроллерами колибри: 18 шагов
Введение в робототехнику для учащихся начальной школы с контроллерами Hummingbird: большинство инструментов робототехники, представленных сегодня на рынке, требуют от пользователя загрузки определенного программного обеспечения на свой жесткий диск. Прелесть робота-контроллера Hummingbird в том, что его можно запускать с помощью веб-компьютера, например Chromebook. Это также было
Портативная консоль с беспроводными контроллерами и датчиками (Arduino MEGA и UNO): 10 шагов (с изображениями)
Портативная консоль с беспроводными контроллерами и датчиками (Arduino MEGA и UNO): Что я использовал: - Arduino MEGA - 2x Arduino UNO - Adafruit 3.5 " TFT 320x480 Сенсорный экран HXD8357D - Зуммер - Динамик 4 Ом, 3 Вт - Светодиодные лампы 5 мм - Принтер Ultimaker 2+ с черной PLA-нитью - Лазерный резак с древесиной МДФ - Черная аэрозольная краска (для дерева) - 3x nRF24