using UnityEngine; using Mirror; using Mirror.BouncyCastle.Tls.Crypto.Impl.BC; public class NetworkMessageHandler : MonoBehaviour { public static NetworkMessageHandler Instance; public static NetworkConnectionToClient CurrentConn; 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) { ServerWorkMessagePanel.workMessage = msgObj.message; ServerWorkMessagePanel.workMessageType = msgObj.type; ServerWorkMessagePanel.workPresent = msgObj.present; ServerWorkMessagePanel.workMessageCount = msgObj.count; if (ServerWorkMessagePanel.workMessageCount != 0) { if (ServerWorkSceneController.Instance != null) { ServerWorkSceneController.Instance.processStep(2); } } if (ServerWorkMessagePanel.Instance) { ServerWorkMessagePanel.prepareData = null; ServerWorkMessagePanel.Instance.onReceivedData(); }else { //動畫還沒結束,先放到預先準備資料中 ServerWorkMessagePanel.prepareData = msgObj; } } else { Debug.LogError("workMessage failed"); } } break; case "workProcess": { switch (msg.payload) { case "exit": // ⭐ 修正點 1: 處理 workProcess/exit // 不再直接呼叫 processStep(9) 或 (10)。改為發送訊號給 Panel,讓 Panel 執行雙重檢查。 if (ServerWorkMessageReplyExitPanel.Instance) { Debug.Log("NetworkMessageHandler: 收到 workProcess/exit 訊號,通知影片面板。"); ServerWorkMessageReplyExitPanel.Instance.ReceiveClientSignal(); } else if (ServerWorkSceneController.Instance) { // 備用機制:如果 Panel 不存在,則直接跳轉。 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; // ⭐ 修正點 2: 處理 gameSurvey // 收到問卷資料後,不再強制切換場景 (Step 10)。 // 我們讓 Panel 在影片播完後,再切換到 Step 10。 // 但是,如果 Client 先發送問卷 (gameSurvey),這代表 Client 已經通過了 exit 流程。 // 因此,我們將 gameSurvey 視為 Client 對整個 Exit 流程的確認。 if (ServerWorkSceneController.Instance) { // 移除上次修正中新增的 processStep(10),改為呼叫雙重檢查。 // 這是因為 gameSurvey 也是 Client 流程結束的訊號之一。 } // 讓 ServerWorkMessageReplyExitPanel 執行雙重檢查 if (ServerWorkMessageReplyExitPanel.Instance) { Debug.Log("NetworkMessageHandler: 收到 gameSurvey 訊號,通知影片面板進行雙重檢查。"); ServerWorkMessageReplyExitPanel.Instance.ReceiveClientSignal(); } // 確保資料載入 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": { } 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}"); } } }