using UnityEngine; using System.IO.Ports; using System.Threading; using System.Collections.Generic; public class ArduinoInput : MonoBehaviour { [Header("串口设置")] public string portName = "COM3"; public int baudRate = 9600; private SerialPort serialPort; private Thread readThread; private Queue dataQueue = new Queue(); private bool isRunning = false; private object queueLock = new object(); void Start() { try { serialPort = new SerialPort( portName, baudRate ); serialPort.ReadTimeout = 100; serialPort.Open(); isRunning = true; readThread = new Thread(ReadSerial); readThread.IsBackground = true; readThread.Start(); Debug.Log("✅ Arduino 连接成功:" + portName); } catch (System.Exception e) { Debug.LogError( "❌ Arduino 连接失败:" + e.Message ); } } void ReadSerial() { while (isRunning) { try { string data = serialPort .ReadLine().Trim(); lock (queueLock) { dataQueue.Enqueue(data); } } catch { } } } void Update() { lock (queueLock) { while (dataQueue.Count > 0) { string data = dataQueue.Dequeue(); if (data == "RESTART") { HandleButton(); } } } } // 供 BoatController 调用 public void HandleData(string data) { if (data == "RESTART") { HandleButton(); } } void HandleButton() { Debug.Log("🔘 按钮按下!" + " isOnStartScreen:" + StartManager.Instance .isOnStartScreen + " gameStarted:" + StartManager.Instance .gameStarted + " isTransitioning:" + StartManager.Instance .isTransitioning ); // 状态1:在开始页面且没有在过渡中 // → 触发开始游戏 if (StartManager.Instance != null && StartManager.Instance .isOnStartScreen && !StartManager.Instance .isTransitioning) { Debug.Log("✅ 触发开始游戏"); StartManager.Instance.PressStart(); return; } // 状态2:losePanel 显示 // → 重新开始 bool losePanelActive = GameManager.Instance != null && GameManager.Instance.losePanel != null && GameManager.Instance.losePanel .activeSelf; if (losePanelActive) { Debug.Log("✅ lose 后重新开始"); GameManager.Instance.RestartGame(); return; } // 状态3:winPanel 显示 // → 重新开始 bool winPanelActive = GameManager.Instance != null && GameManager.Instance.winPanel != null && GameManager.Instance.winPanel .activeSelf; if (winPanelActive) { Debug.Log("✅ win 后重新开始"); GameManager.Instance.RestartGame(); return; } Debug.Log("⚠️ 按钮按下但没有匹配状态"); } void OnDestroy() { isRunning = false; readThread?.Join(500); if (serialPort != null && serialPort.IsOpen) serialPort.Close(); } }