using UnityEngine; using Mirror; // 移除 Mirror.BouncyCastle.Tls.Crypto.Impl.BC 的 using,如果您的專案不需要。 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() { // 確保已經註冊了處理 GameMessage 的 Handler 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; // 1. 鎖定檢查:影片是否正在播放 (Step 5) if (ServerWorkMessageReplyWait1Panel.Instance != null) { // 鎖定中:通知 Panel 等待影片播完 (Step 5) Debug.Log("NetworkMessageHandler: 偵測到 Step 5 影片正在播放,使用鎖定機制!"); ServerWorkMessageReplyWait1Panel.Instance.ReceiveNewWorkMessage(); // ❗ 這裡不執行 processStep(2) } // ⭐ 修正點: 2. 非鎖定狀態:立即切換到 Message Panel (Step 2) else { // 當 Step 6 面板存在時,優先讓它自行處理切換邏輯 if (ServerWorkMessageReplyWait1WorkingPanel.Instance != null) { ServerWorkMessageReplyWait1WorkingPanel.Instance.StopWaitingAndGoToMessagePanel(); } else if (ServerWorkSceneController.Instance != null) { // 備用機制:如果 Step 6 面板不存在,直接讓場景控制器切換 Debug.Log("NetworkMessageHandler: 收到新願望訊號,直接切換到 Step 2。"); ServerWorkSceneController.Instance.processStep(2); } } // 3. 資料處理邏輯 (這段邏輯是確保 Step 2 Panel 收到資料) 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": // Step 9 (Exit Panel) 雙重檢查邏輯 if (ServerWorkMessageReplyExitPanel.Instance) { Debug.Log("NetworkMessageHandler: 收到 workProcess/exit 訊號,通知 Exit 影片面板。"); ServerWorkMessageReplyExitPanel.Instance.ReceiveClientSignal(); } else 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; // Step 9 (Exit Panel) 雙重檢查邏輯 if (ServerWorkMessageReplyExitPanel.Instance) { Debug.Log("NetworkMessageHandler: 收到 gameSurvey 訊號,通知 Exit 影片面板進行雙重檢查。"); 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}"); } } }