Bienvenido a un nuevo conocimiento. Hoy vamos a estar mostrando, acorde al videotutorial de nuestro canal Escuela de Juegos, como conectar Arduino y Unity, en éste caso para enviar un dato.

Lo que haremos, es que al presionar un botón en nuestro circuito de Arduino, vamos a enviar una señal mediante comunicación serial, para que en nuestro videojuego reaccione de una determinada forma, pudiendo funcionar como Joystick por ejemplo.

const int buttonPin = 2;
const int buttonPin2 = 3;
int buttonState = 0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(buttonPinINPUT); //izq
  pinMode(buttonPin2INPUT); //der
}

void loop() {

  //Izq
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    Serial.println(«boton1_e»);
  } 

  //Der
  buttonState = digitalRead(buttonPin2);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    Serial.println(«boton2_e»);
  } 
  //
  delay(2);
}

Como podemos ver en nuestro código de Arduino, lo que hacemos es establecer la comunicación serial, y luego declarar los botones o pulsadores que usaremos.

Finalmente, si alguno de los dos botones está presionado, enviamos un «string» o cadena de texto, con el dato deseado, para reinterpretarlo luego en Unity.

  public SerialPort puerto = new SerialPort(«COM4»9600);

Comenzamos efectuando la comunicación serial. Ahora vamos a proceder a configurarla en detalle.

    puerto.ReadTimeout = 30;
    puerto.Open();
 
Recordá que la ubicación de éstos datos, especialmente los que vienen a continuación, van a ir según como tengas configurado tu jugador o lo que vos quieras que sea el efecto resultante de la presión de los botones. En mi caso lo tengo en el Script Player, correspondiente al jugador. 
 
Ahora vamos a chequear si hay un dato nuevo, y procesarlo.
 
    if(puerto.IsOpen)
    {
        string dato_recibido = puerto.ReadLine();
    }

Ahora necesitamos regular ésto, para que no genere errores ni tampoco sobre sature. Para ello haremos un «try», lo cual ejecutará solo si es posible la lectura.

    try{
        if(puerto.IsOpen)
        {
            string dato_recibido = puerto.ReadLine();
        }
    }catch(System.Exception ex1)
    {
        ex1 = new System.Exception();
    }
 
Solo quedaría interpretar el dato enviado, y según eso hacer lo que nos plazca, en mi caso el movimiento.
 
 
    try{
        if(puerto.IsOpen)
        {
            string dato_recibido = puerto.ReadLine();
            if(dato_recibido.Equals(«boton1_e»))
            {
                //MOVER IZQ
            }
            else if(dato_recibido.Equals(«boton2_e»))
            {
                //MOVER DER
            }
        }
    }catch(System.Exception ex1)
    {
        ex1 = new System.Exception();
    }