using UnityEngine; using Mirror; using UnityEngine.SceneManagement; // 注意:Mirror.BouncyCastle.Tls.Crypto.Impl.BC; 這個 using 似乎是多餘的,但暫時保留。 public class NetworkMessageHandler : MonoBehaviour { public static NetworkMessageHandler Instance; public static NetworkConnectionToClient CurrentConn; // ⭐ 新增:用於記錄是否有未處理的 workMessage (跨場景緩存) public bool hasPendingWorkMessage = false; void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } private void Start() { NetworkServer.RegisterHandler(OnClientMessageReceived); } void OnClientMessageReceived(NetworkConnectionToClient conn, GameMessage msg) { Debug.Log($"收到客戶端訊息: {msg.action} {msg.payload}"); switch (msg.action) { case "welcome": { switch (msg.payload) { case "hello": if (ServerHomeWaittingSceneController.Instance != null) { CurrentConn = conn; ServerHomeWaittingSceneController.Instance.OnClientConnected(); SendMessageToClient("welcome", "hello"); // clean data GlobalData.ResetGameData(); ServerWorkMessagePanel.cleanData(); ServerWorkMessagePanel.workMessageCount = 0; } break; } } break; case "workMessage": { GameMessageWork msgObj = JsonUtility.FromJson(msg.payload); if (msgObj != null) {                         // 關鍵修正 1:在切換 Panel 之前,先更新所有靜態數據 (保留)                         ServerWorkMessagePanel.workMessageCount = msgObj.count; ServerWorkMessagePanel.workMessage = msgObj.message; ServerWorkMessagePanel.workMessageType = msgObj.type; ServerWorkMessagePanel.workPresent = msgObj.present; if (ServerWorkMessagePanel.workMessageCount != 0) { if (ServerWorkSceneController.Instance != null) {                                 // 情況 1: ServerWorkScene 已經載入 (正常流程或影片播放完畢後)                                 // 檢查當前是否正在播放 Step 5 影片                                 if (ServerWorkMessageReplyWait1Panel.Instance != null && ServerWorkMessageReplyWait1Panel.Instance.gameObject.activeInHierarchy) {                                     // 影片正在播放,暫存訊號 (邏輯保留)                                     ServerWorkMessageReplyWait1Panel.Instance.ReceiveClientSignal(); Debug.Log("WorkMessage 收到,但 Step 5 影片正在播放,延遲切換。"); } else {                                     // 影片未播放,直接切換到 Step 2 (MessagePanel)                                     ServerWorkSceneController.Instance.processStep(2); Debug.Log("WorkMessage 收到,直接切換到 Step 2。"); } } else {                                 // 情況 2: ServerWorkScene 尚未載入 (Server正在 Intro 影片中)                                 // 設置緩存旗標 (保留)                                 hasPendingWorkMessage = true; Debug.Log("WorkMessage 收到,但 ServerWorkScene 尚未載入,設置緩存旗標。"); } }                         // ⭐ 移除此處的 onReceivedData() 呼叫                         // 因為當場景流程切換到 Step 2 時,ServerWorkMessagePanel.OnEnable() 會自行處理。                         /*                         if (ServerWorkMessagePanel.Instance)                         {                             ServerWorkMessagePanel.Instance.onReceivedData();                         }                         */                     } else { Debug.LogError("workMessage failed"); } } break; // 修正:這個 break 才是結束 case "workMessage" 的地方 case "workProcess": { switch (msg.payload) { case "exit": if (ServerWorkSceneController.Instance) { ServerWorkSceneController.Instance.processStep(9); } break; case "continue": if (ServerWorkSceneController.Instance) { ServerWorkSceneController.Instance.processStep(12); } break; } } break; case "gameSurvey": { GameMessageSurvey msgObj = JsonUtility.FromJson(msg.payload); if (msgObj != null) { GlobalData.SURVEY_STAR1 = msgObj.val1; GlobalData.SURVEY_STAR2 = msgObj.val2; GlobalData.SURVEY_STAR3 = msgObj.val3; GlobalData.SURVEY_TEXT = msgObj.text1; if (ServerWorkSceneController.Instance) { //不用馬上跳場警,等到動畫結束自動跳場警 //ServerWorkSceneController.Instance.processStep(10); } if (ServerWorkMessageReplyExitSurveyPanel.Instance) { ServerWorkMessageReplyExitSurveyPanel.Instance.loadSurveyData(); } } } break; case "gameProcess": { } break; case "gameOpen": { ServerGamePanel.nameOfTheGameWillBeOpened = msg.payload; if (ServerGamePanel.Instance) { ServerGamePanel.Instance.gameOpen(); } else { //因為時間同步的問題,這2個遊戲強制Server進入遊戲畫面 if (msg.payload == "typing" || msg.payload == "sticks") { ServerWorkSceneController.Instance.processStep(13); } } } break; case "getWords": { if (ServerWorkSceneController.Instance) { ServerWorkSceneController.Instance.processStep(18); } } break; case "gameSurveyFinish": { GameMessageSurvey msgObj = JsonUtility.FromJson(msg.payload); if (msgObj != null) { GlobalData.SURVEY_STAR1 = msgObj.val1; GlobalData.SURVEY_STAR2 = msgObj.val2; GlobalData.SURVEY_STAR3 = msgObj.val3; GlobalData.SURVEY_TEXT = msgObj.text1; if (ServerWorkSceneController.Instance) { ServerWorkSceneController.Instance.processStep(19); } if (ServerGameFinalSurveyPanel.Instance) { ServerGameFinalSurveyPanel.Instance.loadSurveyData(); } } } break; case "gameTalkingPeopleSay": { if (ServerGameTalkingPanel.Instance) { ServerGameTalkingPanel.Instance.onReceivedChatMessage(msg.payload); } } break; case "gameTypingResult": { ServerGameTypingPanel.result = msg.payload; if (ServerGameTypingPanel.Instance) { ServerGameTypingPanel.Instance.OnReceivedResult(); } } break; case "gameSticksFinish": { // 這裡通常是空的 case 區塊 } break; } } public void SendMessageToClient(string action, string message) { if (CurrentConn != null && CurrentConn.isReady) { GameMessage msg = new GameMessage { action = action, payload = message }; CurrentConn.Send(msg); Debug.Log($"發送到客戶端: {message}"); } else { Debug.Log($"發送到客戶端失敗: {message}"); } } }