Połącz joystick z płytką arduino, a następnie podłącz płytkę do komputera przewodem USB. Link to Wokwi project
Poniższe połączenie działa, ale jest mało wydajne. Połączenie Arduino z Unity za pomocą Serial Communication jest znacznie wydajniejsze z użyciem Ardity, darmowej paczki: Paczka Unity Ardity
//Arduino
#define XJOY A1
#define YJOY A2
#define SEL_PIN 2
void setup()
{
pinMode(SEL_PIN, INPUT_PULLUP);
Serial.begin(9600);
}
void loop()
{
int joyX = map(analogRead(XJOY), 0, 1023, -100, 100);
int joyY = map(analogRead(YJOY), 0, 1023, -100, 100);
bool isPressed = digitalRead(SEL_PIN) == LOW;
Serial.print(joyX);
Serial.print("|");
Serial.print(joyY);
Serial.print("|");
Serial.println(isPressed);
}
// Wersja wysyłająca tylko dane po zmianie
//Arduino
#define XJOY A1
#define YJOY A2
#define SEL_PIN 2
int lastJoyX;
int lastJoyY;
int lastBtn;
void setup()
{
pinMode(SEL_PIN, INPUT_PULLUP);
Serial.begin(9600);
lastJoyX = map(analogRead(XJOY), 0, 1023, -100, 100);
lastJoyY = map(analogRead(YJOY), 0, 1023, -100, 100);
}
void loop()
{
int joyX = map(analogRead(XJOY), 0, 1023, -100, 100);
int joyY = map(analogRead(YJOY), 0, 1023, -100, 100);
bool isPressed = digitalRead(SEL_PIN) == LOW;
if(joyX==lastJoyX && joyY==lastJoyY && isPressed==lastBtn) return;
lastJoyX = joyX;
lastJoyY = joyY;
lastBtn = isPressed;
Serial.print(joyX);
Serial.print("|");
Serial.print(joyY);
Serial.print("|");
Serial.println(isPressed);
}
using UnityEngine;
using System.IO.Ports;
using System;
public class ArduinoConnection : MonoBehaviour
{
SerialPort portNo = new SerialPort("COM3", 9600);
public int X { get; private set; }
public int Y { get; private set;}
public bool Btn { get; private set; }
public Vector3 Dir { get; private set; }
void Start()
{
portNo.Open();
portNo.ReadTimeout = 5000;
}
private void Update()
{
Read();
}
void Read()
{
if (portNo.IsOpen)
{
if (portNo.BytesToRead > 0)
{
string[] xy = portNo.ReadLine().Split('|');
if (Int32.TryParse(xy[0], out int x) &&
Int32.TryParse(xy[1], out int y) &&
Int32.TryParse(xy[2], out int b))
{
X = Math.Abs(x) < 5 ? 0 : x;
Y = Math.Abs(y) < 5 ? 0 : y;
Dir = new Vector3(-X, Y, 0);
Btn = b == 1 ? true : false;
}
}
}
else
{
Dir = Vector3.zero;
}
}
}
using UnityEngine;
public class CubeMove : MonoBehaviour
{
[SerializeField] ArduinoConnection joystick;
void Update()
{
transform.position += joystick.Dir * 0.05f * Time.deltaTime;
if (joystick.Btn)
{
transform.localEulerAngles += new Vector3(0, 100f, 0)*Time.deltaTime;
}
}
}