Como fazer um controlador de jogo personalizado com Arduino e Unity

Alguma vez você já quis projetar seu próprio controle de jogo? É mais fácil do que você pensa!

Alguma vez você já quis projetar seu próprio controle de jogo?  É mais fácil do que você pensa!
Propaganda

Alguma vez você já quis projetar seu próprio controle de jogo? É mais fácil do que você pensa!

Neste pequeno projeto, construiremos um controlador de jogo personalizado simples para usar com o mecanismo de jogo Unity. Este controlador será alimentado por um Arduino Uno, embora você possa usar uma das muitas alternativas Arduino Buying Guide: Qual placa você deve obter? Guia de compra do Arduino: Qual placa você deve obter? Existem tantos tipos diferentes de placas Arduino por aí, você seria perdoado por estar confuso. Qual você deve comprar para o seu projeto? Deixe-nos ajudar, com este guia de compra do Arduino! Leia mais lá fora para este projeto também. Nós também criaremos um jogo básico onde você usará seu controlador para evitar objetos em queda e diminuir o tempo.

Para este projeto você precisará

  • Arduino ou microcontrolador similar
  • 1 resistor de 10k Ohm
  • 1 x comutador momentâneo
  • 1 x potenciômetro
  • Fios de ligação
  • Uma tábua de pão
  • Motor de jogo Unity
  • O plugin Uniduino da Unity Asset Store (US $ 30)
  • Código completo do projeto, caso você não queira escrevê-lo (não inclui o plugin Uniduino)

A maioria dessas coisas está disponível em um kit inicial do Arduino. Se você não tem um kit para iniciantes, confira nosso guia para escolher os melhores 4 Melhores Kits Iniciantes para Iniciantes Arduino 4 Melhores Kits Iniciantes para Iniciantes Arduino Há uma abundância de ótimos projetos iniciantes em Arduino que você pode usar para começar, mas você precisa de um Arduino e alguns componentes primeiro. Aqui está nossa escolha de 4 dos melhores kits iniciais para ... Leia Mais um para você.

Você pode tornar o seu controlador o mais complicado que você desejar, mas para este exemplo vamos configurar um potenciômetro e um botão - perfeito para controlar um simples jogo arcade.

Placa de Provas Personalizada 670

Montando seu Controlador

Configure sua placa de montagem e Arduino como mostrado na imagem abaixo. Isto é o que estaremos usando como nosso controlador de jogo, embora você possa usar quase a mesma configuração que um controlador midi DIY Como fazer um controlador MIDI com um Arduino Como fazer um controlador MIDI com um Arduino Como um músico que acumulou uma coleção de instrumentos musicais e caixas de ruído, o humilde Arduino é a ferramenta perfeita para criar um controlador MIDI personalizado. Leia mais também!

Diagrama de Fritzing anotado

Preparando seu Arduino

Uma vez que você tenha tudo conectado, conecte seu Arduino via USB. No Arduino Software IDE, vá para Ferramentas> Placa e Ferramentas> Porta para selecionar qual microcontrolador e porta você está usando. O Arduino IDE vem com o esboço que precisamos e você pode encontrá-lo em Arquivo> Exemplos> Firmata> StandardFirmata . Clique em Upload e você estará pronto para ir.

Se você é novo no Arduino e sua cabeça está derretendo um pouco, confira nosso Guia do Iniciante Introdução ao Arduino: Um Guia para Iniciantes Introdução ao Arduino: um Guia para Iniciantes Arduino é uma plataforma de prototipagem eletrônica de código aberto baseada em flexível, fácil de usar use hardware e software. É destinado a artistas, designers, amadores e qualquer pessoa interessada em criar objetos ou ambientes interativos. Leia mais para ajudá-lo a falar bem com o seu computador.

Configurando seu projeto Unity

No Unity, abra o Window> Asset Store para acessar o Asset Store do Unity a partir do Unity Editor. Pesquise na loja de recursos pelo plug-in Uniduino. Este plugin permitirá que você receba e envie dados de e para seus pinos do Arduino dentro do Unity. O plugin no momento da escrita custa US $ 30. É possível fazer este projeto sem comprar o plugin, embora seja um pouco mais complicado e você pode achar o plugin mais conveniente para todos.

Loja Unity Asset Uniduino

Este vídeo dos criadores do plugin leva você através do processo de teste de tudo que está funcionando, juntamente com a configuração inicial. Observe que você também pode precisar redefinir o editor Unity no Windows.

Podemos usar esse mesmo painel de teste para testar nosso controlador. Ajuste o Pino D2 para INPUT e Digital. Mais abaixo, defina o Pino A5 para ANALOG. Seu potenciômetro e botão devem exibir valores na tela ao lado de seus números de pinos agora. Progresso!

Teste Uniduino

Agora para fazer algo que podemos controlar

Então nós temos um controlador, mas o que devemos controlar? Bem, as possibilidades são infinitas, mas hoje criaremos um jogo de esquiva muito simples para testar nosso novo sistema de controle. Passaremos pela configuração do jogo muito rapidamente, então se você é totalmente novo no mecanismo Unity, você pode encontrar o nosso Guia Unity de Programação de Jogo Unity Um Jogo Com Unity: Um Guia para Iniciantes Programando Um Jogo Com Unity: Um Guia para Iniciantes No cenário do desenvolvimento de jogos indie, o Unity surgiu como um padrão de fato: seu baixo custo, facilidade de uso e amplo conjunto de recursos o tornam ideal para o rápido desenvolvimento de jogos. Leia mais útil para se orientar.

Vamos construir um jogo muito básico em que seu objetivo é desviar sua esfera para a esquerda e direita para evitar a queda de cubos, o que irá utilizar o seu controlador personalizado recém-feito.

Crie uma nova cena e arraste o prefab do Uniduino de Assets> Uniduino> Prefabs para sua hierarquia e arraste o prefab do Uniduino para a hierarquia. Precisamos disso para conversar entre o nosso jogo e o controle.

Na hierarquia Unity, clique em Criar> Esfera e use a guia Transformar no Inspetor para movê-lo para a parte inferior da tela do jogo.

Posição do Inspetor Esfera X

É hora de obter codificação

Agora, adicione algum código a essa festa. Com a esfera selecionada na Hierarquia, clique em Adicionar componente> Novo script na parte inferior da janela Inspetor. Nomeie-o como sphereMover e selecione C Sharp no menu suspenso. Clique em Criar e Adicionar e o script será adicionado ao GameObject. Clique duas vezes nele para abrir o script e digite este código:

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

Reserve um momento para ler os comentários do código. Até agora, nós declaramos algumas variáveis ​​para o nosso Arduino, seus pinos e nossa Esfera. Nós também usamos o
Métodos Start e ConfigurePins para inicializar nosso Arduino em tempo de execução. Vamos salvar nosso script e voltar ao editor do Unity e ver o que mudou.

Script do Mover de Esfera com Variáveis ​​Vazias

Agora podemos ver nossas variáveis ​​públicas na janela do Inspetor. Vamos ver o que podemos entrar neste estágio para nos ajudar mais tarde. Sabemos que pinos estamos usando no Arduino de nossa build anterior, podemos inseri-los. Sabemos também do nosso experimento mais cedo, até onde queremos que nossa esfera possa viajar para a esquerda e para a direita, para que ela não caia da tela. Vamos inserir esses valores agora.

Roteiro do Mover de Esfera com Variáveis

Primeiros sinais de vida

É hora de realmente ver os valores do nosso Arduino dentro do Unity Editor. Por enquanto, podemos adicionar uma linha de código à função de atualização do nosso script sphereMover e salvar o script novamente.

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

Agora que temos nossa variável potValue atualizada em cada quadro, podemos ver seu valor em tempo real no Unity Inspector. Antes de fazermos um teste, agora seria um bom momento para verificar se o plug-in do Uniduino está escutando na porta correta. Clique em Uniduino na hierarquia e verifique seu nome de porta no Inspetor. Se estiver em branco, preencha o número de porta correto para o seu Arduino. Neste caso, foi COM4, ​​embora possa ser diferente para você. Verifique usando o IDE do Arduino se não tiver certeza.

A porta de verificação do Uniduino está correta

Selecione sua esfera na hierarquia e clique no botão Reproduzir na parte superior da tela. O sistema precisa de alguns segundos para inicializar, após o qual você deve começar a ver a variação da variável Valor do Pote no inspetor quando mover o potenciômetro.

Sinais da Vida 2

Agora estamos falando! Bem, estritamente falando, a Unidade e o Arduino estão falando, mas quem está contando? Se você chegou até aqui e não está vendo a mudança de valor no inspetor, verifique as etapas de configuração e verifique se você tem a porta correta selecionada para o seu Arduino.

Vamos mover esta esfera

Agora que temos a variável potValue sendo atualizada, queremos usar esse valor para mover nossa esfera. Quando o potenciômetro está totalmente para a esquerda, queremos que a esfera esteja no lado esquerdo da tela e vice-versa. Os objetos no Unity são posicionados em um ponto no espaço vetorial, determinado pelos valores de Transform.position. Na imagem abaixo, onde a esfera está no ponto mais distante à esquerda, queremos que você veja que o vetor de posição é 9, 5, -4, 0.

Exemplo de Transformação 670

Queremos afetar a posição X da esfera. Infelizmente, o uso direto dos valores de nosso potenciômetro não funcionará diretamente, pois quando o potenciômetro está todo para a esquerda, o valor é 0 - o que colocaria nossa esfera no meio da tela. No outro extremo, o valor máximo do potenciômetro, 1023, colocaria o cubo na direita da tela. Nao é útil. O que precisamos aqui é de matemática.

Por que matemática quando a unidade fará isso por você?

Para aqueles de vocês lá fora temendo olhar para um pedaço de papel coberto de números absurdos (embora existam alguns grandes sites Os 20 sites que você precisa para aprender matemática passo a passo Os 20 sites que você precisa para aprender matemática passo a passo Nós compilamos o melhores sites para cada nível para que você possa aprender sistematicamente, obter uma melhor compreensão da matemática um nível de cada vez, e se divertir! Leia mais que pode ajudá-lo a aprender matemática), não tenha medo. Precisamos de uma maneira de fazer nossos valores de potenciômetro corresponderem à posição X da nossa esfera. Felizmente, podemos usar um método de extensão .

Um método de extensão é um script que faz um trabalho específico para nós. Nesse caso, damos os valores que temos e os retorna mapeados para um outro, prontos para serem usados ​​em nosso script sphereMover . Na parte superior do painel Project, clique em Create> C # Script e nomeie-o como ExtensionMethods. Digite o código abaixo no 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; } } 

Salve o script e volte ao seu script sphereMover. Agora podemos usar esta função Remap no nosso script ExtensionMethods em nossa função Update para converter nossos valores de potenciômetro em valores utilizáveis ​​em nosso jogo. Em que apenas atribuímos a variável potValue, digite o seguinte:

Remapear Função

O prompt nos mostra que nossa Remap leva dois conjuntos de valores From e To e os mapeia juntos. Podemos inserir nossos valores nisso.

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

Salve seu script, volte para o editor do Unity e aperte o botão play. Agora você deve ver que a variável Pot Mapeada muda quando você move o potenciômetro, para corresponder aos valores que determinamos para nossas bordas esquerda e direita. Reserve um momento para sentar e agradecer ao seu script ExtensionMethods. Não é uma calculadora à vista.

Pot Mapeado

Nota: se você está percebendo que seus valores estão invertidos, então quando o seu potenciômetro está todo para a direita, você está recebendo um valor negativo para sua variável Mapped Pot, você pode ter seu potenciômetro configurado incorretamente. Felizmente, você pode consertar isso sem fazer qualquer religação. Você pode simplesmente mudar os valores quando os remapear:

Mudar Remapear

Agora finalmente temos valores utilizáveis. Agora tudo o que resta a fazer é atribuir esses valores à posição X da nossa esfera:

 //Assign the mapped pot value to the sphere's x position transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z); 

Salve seu script, volte para o editor do Unity e pressione play. Agora você deve poder mover sua Esfera para a esquerda e direita usando seu potenciômetro!

Colocando o botão para trabalhar

Agora que temos a nossa esfera em movimento, não seria bom ter uma maneira de retardar um pouco as coisas quando entramos em uma situação difícil? Vamos usar o nosso botão para retardar o tempo no nosso jogo. Abra o seu script sphereMover e adicione este código à sua função de atualização

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

Agora temos a mecânica do nosso jogo, vamos adicionar alguns obstáculos! Nós vamos usar o inimigo natural da esfera, o cubo. Na hierarquia, clique em Criar> Objeto 3D> Cubo . No inspetor do cubo, Adicionar componente> Física> Corpo rígido . Defina o valor Drag do corpo rígido como 5. Além disso, no componente Box Collider do inspetor, selecione Is Trigger. Isso nos permitirá detectar colisões com nossa Esfera.

Crie um script no cubo e chame-o collideWithSphere, abra o script e exclua as funções Iniciar e Atualizar, pois não precisaremos mais delas. Digite este código:

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

OnTriggerEnter envia uma mensagem sempre que o colisor de gatilho acerta outro colisor. Neste caso, estamos dizendo para destruir o que quer que toque. Salve o script e volte para o editor do Unity. Arraste o cubo da hierarquia para o painel Projeto. Você notará que o texto do cubo na hierarquia ficou azul. Isso porque criamos uma pré-fabricada e a salvamos em nosso projeto. Exclua seu cubo da hierarquia agora.

Tudo o que precisamos agora é um script para gerar os cubos. Na hierarquia, clique em Criar> Criar Vazio e renomeie-o para Gerenciador de Jogos no Inspetor e adicione um script a ele chamado gameManager. Abra o script e adicione este código:

 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< numberToSpwan; i++) { Instantiate(cube, new Vector3(Random.Range(-9, 9), Random.Range(lowestSpawnheight, highestSpawnheight), 0), Quaternion.identity); } } // Update is called once per frame void Update () { } } 

Salve o script. De volta ao editor, selecione o Gerenciador de Jogos na hierarquia e arraste seu cubo pré-fabricado do painel do projeto para a variável Cubo no Inspetor. Preencha os valores para sua desova aqui também. Você pode mexer com isso para torná-lo tão difícil ou fácil quanto você gosta. Note que vale a pena ter seus cubos mais baixos gerados o suficiente para permitir a inicialização do Uniduino - perder o jogo antes que você possa se mover pode ser frustrante!

Gerenciador de jogos

O projeto final

Agora, quando você aperta o play, os cubos vão aparecer acima de você e cair. Você pode usar seu potenciômetro para evitá-los, e seu botão para diminuir o tempo.

Neste projeto, criamos um controlador personalizado com um Arduino, configuramos o Unity e o Uniduino para nos comunicarmos com ele e criamos um jogo simples para testá-lo. Os conceitos aqui podem ser aplicados a quase todos os projetos, e há até mesmo atolamentos de jogos que se especializam em controladores personalizados.

Com o Arduino e o Unity, você poderia criar um controlador personalizado a partir de praticamente qualquer coisa. Você criou um aparelho de som que controla uma espaçonave? Uma torradeira que controla um jogo de plataforma?

Se você fez um projeto como este, eu adoraria ver! Publique nos comentários abaixo!

In this article