第一种方式:
我的按钮是带灯的,这个灯也是为了可以提醒用户什么时候可以按按钮,开始游戏,
灯亮,说明你可以按下按钮开始游戏
灯灭,说明这个时候按下按钮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);
}
}}