Arduino跟Unity通讯,我的按钮的标准写法

第一种方式:

我的按钮是带灯的,这个灯也是为了可以提醒用户什么时候可以按按钮,开始游戏,

灯亮,说明你可以按下按钮开始游戏

灯灭,说明这个时候按下按钮Unity的逻辑还没执行完,不会接收你按按钮开始游戏的讯号

String comdata = ""; // 接收Unity 发送过来的消息

int btnPin = 2; // 按钮
int ledPin = 3; // 按钮的灯光
boolean m_bBtnFirstPressed = true;// 用于控制按钮每次按下 发送一次数据就行
void setup() {
  // 串口初始化
  Serial.begin(9600, SERIAL_8N1);
  pinMode(btnPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  // 初始灯光亮
  digitalWrite(ledPin, HIGH);
}
void loop() {
   //常闭按钮 向 Unity 发送开始游戏讯号
   // 这种写法是把逻辑丢给Unity ,我这边不做任何处理 ,只告诉unity 我这按下按钮了
  if (digitalRead(btnPin) == 0) {
    if (m_bBtnFirstPressed) {
      // 告诉Unity 可以开始了,Unity 需要判断在当前界面是否可以开始游戏
      Serial.println("1");
      // 按下按钮灯光灭
      digitalWrite(ledPin, LOW);
      m_bBtnFirstPressed = false;
    }
  } else {
    if (!m_bBtnFirstPressed) {
      m_bBtnFirstPressed = true;
    }
  }

 // 这个Delay 很重要,让按钮按下逻辑跟松开逻辑有个停顿
  delay(5);
  
  // 接收串口消息
  while (Serial.available() > 0)
  {
    comdata += char(Serial.read());
    delay(2);
  }
  if (comdata.length() > 0)
  {
    // 接收到 unity 发送过来的1,说明游戏结束,玩家可以重新开始游戏了
    if (comdata == "1")
    {
      // 出货成功之后重置参数下一次继续
      digitalWrite(ledPin, HIGH);
    }
    delay(5);
    comdata = "";
  }


 
}

第二种方式 Uduino插件

使用这个插件是为了可以不用关心你的单片机是在哪个端口的,它会自动找到你的端口,所以读取和写入的前一秒的数据不要

Uduino 初始设置: https://marcteyssier.com/uduino/tutorials/uduino-quick-start-guide

拖拽Uduino 预设体到场景 如下设置,单片机请选用自己的类型,下载Arduino 库:https://marcteyssier.com/uduino/content/version/uduino_library.unitypackage

使用方式,它这个插件有个小问题,它会遍历所有的端口,找到你的端口上有单片机的那个端口,这样你就不要考虑你的单片机插到什么端口了,

所以前一秒的数据不要,数据可能是读取的其他端口

第一次使用的时候需要将它的例子中的Uduino.ico 上传到你的单片机,后续就可以不用管它了,所有命令都在 Unity里写

  // Arduino 代码 先初始化端口针脚
            UduinoManager.Instance.pinMode(_iStartBtnPin, PinMode.Input_pullup);
            UduinoManager.Instance.pinMode(int _iLedPin, PinMode.Output);
            UduinoManager.Instance.digitalWrite(_iStartBtnPin, Uduino.State.HIGH);
            this.Delay(0.5f, () => { UduinoManager.Instance.analogWrite(_iLedPin, 255); });


        int _iStartBtnPin = 10;
        int _iLedPin = 11;
        float _timer = 0f;
        bool _bIsFirst = true;
        private void Update()
        {
            //不读取第一秒的数据,这个时候,它应该是在遍历端口,找到单片机
            int buttonState = UduinoManager.Instance.digitalRead(_iStartBtnPin);
            if (_bIsFirst)
            {
                _timer += Time.deltaTime;
                if (_timer > 1f)
                {
                    _bIsFirst = false;
                }
            }
            else
            {
                //Debug.Log("buttonState:  " + buttonState);
                if (buttonState == 0 && BtnStart.interactable)
                {
                    BtnStart.onClick.Invoke();
                    UduinoManager.Instance.analogWrite(_iLedPin, 0);
                }
            }

        }

猜你喜欢

转载自blog.csdn.net/qq_39097425/article/details/110235598