Como fazer um controlador de jogo personalizado com Arduino e Unity

Como fazer um controlador de jogo personalizado com Arduino e Unity

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





Neste breve projeto, construiremos um controlador de jogo personalizado simples para usar com o motor de jogo Unity. Este controlador será alimentado por um Arduino Uno, embora você também possa usar uma das muitas alternativas disponíveis para este projeto. Também criaremos um jogo básico onde você usará seu controlador para evitar a queda de objetos e diminuir o tempo.





Para este projeto, você precisará

  • Arduino ou microcontrolador semelhante
  • 1 x resistor de 10k Ohm
  • 1 x interruptor momentâneo
  • 1 x potenciômetro
  • Fios de conexão
  • Uma placa de ensaio
  • Motor de jogo Unity
  • O plugin Uniduino da Unity Asset Store ($ 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 não tiver um kit inicial, confira nosso guia para escolher o melhor para você.





Você pode tornar seu controlador tão complicado quanto desejar, embora, para este exemplo, iremos configurar um potenciômetro e um botão - perfeito para controlar um jogo simples de arcade.

Montando Seu Controlador

Configure sua placa de ensaio e o Arduino conforme mostrado na imagem abaixo. Isso é o que usaremos como nosso controlador de jogo, embora você possa usar quase a mesma configuração de um Controlador midi faça você mesmo também!



Preparando Seu Arduino

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

Se você é novo no Arduino e sua cabeça está derretendo um pouco, confira nosso Guia do iniciante para ajudá-lo a falar bem com seu computador.





Configurando Seu Projeto Unity

No Unity, abra Janela> Loja de ativos para acessar o Asset Store da Unity de dentro do Editor da Unity. Pesquise o Asset Store pelo plugin 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 $ 30. É possível para fazer este projeto sem comprar o plug-in, embora seja um pouco mais complicado e você possa achar o plug-in mais conveniente em geral.

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





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

Agora, para fazer algo que possamos controlar

Portanto, temos um controlador, mas o que devemos controlar? Bem, as possibilidades são infinitas, mas por hoje devemos criar um jogo de esquiva muito simples para testar nosso novo sistema de controle. Vamos mudar a configuração do jogo rapidamente, então se você é totalmente novo no motor Unity, você pode encontrar nosso Guia para iniciantes em programação de jogos do Unity útil para orientar-se.

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

Crie uma nova cena e arraste o pré-fabricado Uniduino de Ativos> Uniduino> Pré-fabricados em sua hierarquia e arraste o pré-fabricado Uniduino para a hierarquia. Precisamos dele lá para fazer a conversa entre nosso jogo e o controlador.

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

É hora de começar a codificação

Agora, para adicionar algum código a esta festa. Com a esfera selecionada na Hierarquia, clique Adicionar Componente> Novo Script na parte inferior da janela do Inspetor. Diga sphereMover e selecione C Sharp no menu suspenso. Clique 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, declaramos algumas variáveis ​​para nosso Arduino, seus pinos e nossa esfera. 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 para ver o que mudou.

Agora podemos ver nossas variáveis ​​públicas na janela Inspetor. Vamos ver o que podemos inserir nesta fase para nos ajudar mais tarde. Sabemos quais pinos estamos usando no Arduino de nossa construção anterior, podemos inseri-los. Também sabemos, com base em nosso experimento anterior, o quão longe queremos que nossa esfera seja capaz de viajar para a esquerda e para a direita para que não caia da tela. Vamos inserir esses valores agora.

Primeiros sinais de vida

É hora de realmente ver os valores de nosso Arduino dentro do Editor do Unity. Por enquanto, podemos adicionar uma linha de código à função Atualizar 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 nossa variável potValue está sendo atualizada a cada quadro, podemos ver seu valor em tempo real no Unity Inspector. Antes de testá-lo, agora seria um bom momento para verificar se o plug-in Uniduino está ouvindo na porta certa. Clique em Uniduino na hierarquia e verifique o nome da porta no Inspetor. Se estiver em branco, preencha o número da porta correto para seu Arduino. Nesse caso, era COM4, ​​embora possa ser diferente para você. Verifique usando o IDE do Arduino se não tiver certeza.

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 os quais você deve começar a ver a alteração da variável Pot Value no inspetor ao mover o potenciômetro.

Agora estamos falando! Bem, estritamente falando, Unity e o Arduino estão conversando, 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 certifique-se de ter selecionado a porta correta 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 seu Transform.position . Na imagem abaixo, onde a esfera está no ponto mais distante à esquerda que gostaríamos, você pode ver que seu vetor de posição é 9,5, -4, 0.

Queremos afetar a posição X da esfera. Infelizmente, usar os valores do nosso potenciômetro diretamente não funcionará, pois quando o potenciômetro está totalmente à esquerda ele dá um valor 0 - o que colocaria nossa esfera bem no meio da tela. No outro extremo, o valor máximo do potenciômetro, 1023, colocaria o cubo bem à direita da tela. Nao é útil. O que precisamos aqui é alguma matemática.

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

Para aqueles de vocês por aí com medo de olhar para um pedaço de papel coberto de números absurdos (embora haja alguns ótimos sites que pode ajudá-lo a aprender matemática), não tenha medo. Precisamos de uma maneira de fazer com que os valores do nosso potenciômetro correspondam à 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 a ele os valores que temos, e ele os retorna mapeados um ao outro, prontos para serem usados ​​em nosso sphereMover roteiro. Na parte superior do painel Projeto, clique em Criar> Script C # e nomeie-o ExtensionMethods. Insira 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 para o script do sphereMover. Agora podemos usar esta função Remap em nosso script ExtensionMethods em nossa função Update para converter nossos valores de potenciômetro em valores utilizáveis ​​em nosso jogo. Sob aonde acabamos de atribuir a variável potValue, digite o seguinte:

O prompt nos mostra que nosso Remapear pega dois conjuntos de valores De e Para 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 Mapped Pot 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. Nenhuma calculadora à vista.

Nota: se você está percebendo que seus valores estão invertidos, então quando seu potenciômetro está totalmente para a direita você está obtendo um valor negativo para sua variável de Potência mapeada, você pode ter seu potenciômetro configurado ao contrário. Felizmente, você pode consertar isso sem precisar reconectar a fiação. Você pode simplesmente mudar os valores ao remapea-los:

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

rotação de vídeos no windows media player
//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 conseguir mover sua esfera para a esquerda e para a direita usando o potenciômetro!

Colocando o botão para funcionar

Agora que temos nossa esfera em movimento, não seria bom ter uma maneira de desacelerar um pouco as coisas quando entramos em uma situação difícil? Usaremos nosso botão para diminuir o tempo de nosso jogo. Abra o script do 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 que temos a mecânica do nosso jogo, vamos adicionar alguns obstáculos! 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 de Drag do corpo rígido como 5. Além disso, no componente Box Collider no 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 delas desta vez. Insira 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 atinge outro colisor. Neste caso, estamos dizendo a ele para destruir tudo o que tocar. 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 ocorre porque criamos um pré-fabricado e o salvamos em nosso projeto. Exclua seu cubo da hierarquia agora.

Tudo o que precisamos agora é um script para gerar os cubos. Clique na hierarquia Criar> Criar Vazio e renomeie-o para Game Manager no Inspector e adicione um script 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 {
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 Game Manager na hierarquia e arraste o seu cubo pré-fabricado do painel do projeto para a variável Cube no Inspetor. Preencha os valores para sua desova aqui também. Você pode mexer nele para torná-lo tão difícil ou fácil quanto desejar. Note que vale a pena ter seus cubos mais baixos desovando alto o suficiente para permitir que o Uniduino seja inicializado - perder o jogo antes que você seja capaz de se mover pode ser frustrante!

O Projeto Terminado

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

Neste projeto, criamos um controlador personalizado com um Arduino, configuramos o Unity e o Uniduino para se comunicar com ele e criamos um jogo simples para testá-lo. Os conceitos aqui podem ser aplicados a quase qualquer projeto, e há até game jams especializados em controladores personalizados .

Com o Arduino e o Unity, você pode criar um controlador personalizado de quase tudo. Você criou um aparelho de som que controla uma nave espacial? Uma torradeira que controla um jogo de plataforma?

Se você fez um projeto como este eu adoraria vê-lo! Poste nos comentários abaixo!

Compartilhado Compartilhado Tweet O email 6 alternativas audíveis: os melhores aplicativos de audiolivros gratuitos ou baratos

Se você não gosta de pagar por audiolivros, aqui estão alguns ótimos aplicativos que permitem ouvi-los gratuitamente e legalmente.

Leia a seguir
Tópicos relacionados
  • faça você mesmo
  • Programação
  • Arduino
  • Controle de vídeo game
  • Desenvolvimento de jogos
Sobre o autor Ian Buckley(216 artigos publicados)

Ian Buckley é jornalista freelance, músico, performer e produtor de vídeo que mora em Berlim, Alemanha. Quando não está escrevendo ou no palco, ele está mexendo em eletrônicos ou códigos DIY na esperança de se tornar um cientista maluco.

Mais de Ian Buckley

Assine a nossa newsletter

Junte-se ao nosso boletim informativo para dicas de tecnologia, análises, e-books grátis e ofertas exclusivas!

Clique aqui para se inscrever