将 Unity Game 与 [ Arduino + 蓝牙模块 (HC?05) ] 或 ESP32 连接

Sru*_*unt 5 bluetooth arduino unity-game-engine hc-05

我想通过蓝牙将我的Unity 3D 游戏Arduino微控制器连接,为此我使用(HC\xe2\x80\x9005) 蓝牙模块。

\n

为此,资源商店中有一个名为Arduino Bluetooth Plugin Link 的插件。\n收费为 19 美元。

\n

有没有其他方法可以通过使用免费功能编码来做到这一点?

\n

Lot*_*tan 2

是的。

不是 100% 确定,但我认为蓝牙的工作方式与 USB 连接非常相似。这是 Unity 中 Arduino 的 C# 控制器的示例,可与 Arduino USB 连接配合使用:

using System;
using System.IO.Ports;
using UnityEngine;
using UnityEngine.UI;

public class ArduinoController : MonoBehaviour
{
    [Header("Messages")]
    [SerializeField] private String m_MessageReaded = "";
    [SerializeField] private String m_MessageSended = "";

    [Header("SerialPort values")]
    [SerializeField] private String m_COM = "COM7";
    [SerializeField] private int m_baudrate = 115200;
    [SerializeField] private int m_readTimeout = 10;
    [SerializeField] private int m_writeTimeout = 10;
    [SerializeField] private float m_delay = 0.05f;
    private SerialPort m_serialPort;
    private float m_lastSentTime;



    //Initialize and open SerialPort, set timers
    void Start()
    {
        m_serialPort = new SerialPort(m_COM, m_baudrate)
        {
            ReadTimeout = m_readTimeout,
            WriteTimeout = m_writeTimeout
        };

        OpenPort(m_serialPort);

        m_lastSentTime = Time.time;
    }

    // Update is called once per frame
    void Update()
    {
        ManageArduinoCommunication();
    }

    //Encapsulated try-catch to open the port
    void OpenPort(SerialPort port)
    {
        try
        {
            port.Open();
            print("Open Port " + port.PortName);

        }
        catch (Exception e)
        {
            print("Do not open Port " + port.PortName);
        }
    }

    public void ManageArduinoCommunication()
    {
        if (m_serialPort != null)
        {
            if (m_serialPort.IsOpen)
            {
                //WRITE TO ARDUINO
                WriteToArduino();

                //READ FROM ARDUINO
                ReadFromArduino();
            }
        }
        else
        {
            OpenPort(m_serialPort);
        }

    }

    private void WriteToArduino()
    {
        m_MessageSended = "";

        if (!Input.GetKeyDown(KeyCode.LeftShift))
        {
            if (Input.GetKeyDown(KeyCode.Alpha2))
            {
                m_MessageSended = "openGate";
                m_serialPort.WriteLine(m_MessageSended);
            }
            if (Input.GetKeyDown(KeyCode.Alpha4))
            {
                m_MessageSended = "closeGate";
                m_serialPort.WriteLine(m_MessageSended);
            }
        }
    }

    private void ReadFromArduino()
    {
        if (Time.time - m_lastSentTime >= m_delay)
        {
            try
            {
                m_MessageReaded = m_serialPort.ReadLine();
            }
            catch (TimeoutException e)
            {
                // no-op, just to silence the timeouts.
                // (my arduino sends 12-16 byte packets every 0.1 secs)
            }
            m_lastSentTime = Time.time;
        }
    }

    private void OnApplicationQuit()
    {
        m_serialPort.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您需要 Arduino 端的代码类似于以下内容:

//define PINS
#define DOOR_PIN_OPEN 26
#define DOOR_PIN_OPEN_2 27
#define DOOR_PIN_CLOSE 30
#define DOOR_PIN_CLOSE_2 31   

//declare variables
bool isOpen = false;
String message = ""; 

void setup() {
  //Set pinModes
  pinMode(DOOR_PIN_OPEN,OUTPUT);
  pinMode(DOOR_PIN_OPEN_2,OUTPUT);
  pinMode(DOOR_PIN_CLOSE,OUTPUT);
  pinMode(DOOR_PIN_CLOSE_2,OUTPUT);
  
  //Set initial values
  digitalWrite(DOOR_PIN_OPEN, HIGH);
  digitalWrite(DOOR_PIN_OPEN_2, HIGH);
  digitalWrite(DOOR_PIN_CLOSE, LOW);
  digitalWrite(DOOR_PIN_CLOSE_2, LOW);

  Serial.begin(115200);
}

void loop() {
  if(Serial.available() > 0){
    ReadSensorsStates();
    
    //CheckSerialInputs();
    
    ReadFromUnity();

    UpdateSensorsStates();
  }
  else{
    //Serial.println("not available");  
  }
}

void ReadSensorsStates(){
    //Start the sensors reading
    isOpen = ( digitalRead(DOOR_PIN_OPEN) == LOW );
    
    //Serial.println(isOpen);
}

void CheckSerialInputs(){
}

void ReadFromUnity()
{
    message = Serial.readString();
    message = message.substring(0,message.length() -2); //purge \0\n

    if( message == "openGate" ){
      Serial.println(message);
      delay(500);    
    
      digitalWrite(DOOR_PIN_OPEN, HIGH);
      digitalWrite(DOOR_PIN_CLOSE, LOW);        
    }
    
    if(message == "closeGate"){
      Serial.println(message);
      delay(500); 
      digitalWrite(DOOR_PIN_OPEN, LOW);
      digitalWrite(DOOR_PIN_CLOSE, HIGH);        
    }

    //reset variables
    message = "";  
    delay(200);    
}

void UpdateSensorsStates()
{
  //code to update sensorsStates
}
Run Code Online (Sandbox Code Playgroud)

有了所有这些信息,您肯定可以弄清楚蓝牙是否需要任何额外的配置或修改,如果是这种情况请告诉我们^^