using UnityEngine; using Mirror; // 移除 Mirror.BouncyCastle.Tls.Crypto.Impl.BC 的 using,如果您的專案不需要。 public class NetworkMessageHandler : MonoBehaviour { public static NetworkMessageHandler Instance; public static NetworkConnectionToClient CurrentConn = null; public static NetworkConnectionToClient CurrentConn2ndScreen = null; public static NetworkConnectionToClient CurrentConn2ndScreenServer = null; 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; case "The2ndScreenClient": if (CurrentConn2ndScreen == null) { CurrentConn2ndScreen = conn; SendMessageTo2ndScreenClient("welcome", "hello"); } break; case "The2ndScreenServer": if (CurrentConn2ndScreenServer == null) { CurrentConn2ndScreenServer = conn; SendMessageTo2ndScreenServer("welcome", "hello"); } break; } } break; case "The2ndScreenClient": { SendMessageTo2ndScreenClient("The2ndScreenClient", msg.payload); } break; case "The2ndScreentServer": { SendMessageTo2ndScreenServer("The2ndScreentServer", msg.payload); } 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; //Debug.LogWarning($"[CY] workMessageCount: {ServerWorkMessagePanel.workMessageCount}"); if (ServerWorkMessagePanel.workMessageCount != 0) { //是否忙碌中(播影片時為忙碌中) bool isBusy = false; if (ServerWorkMessageReplyWait1Panel.Instance !=null && ServerWorkMessageReplyWait1Panel.Instance.isActiveAndEnabled) { isBusy = true; ServerWorkMessageReplyWait1Panel.Instance.ReceiveNewWorkMessage(); }else if (ServerWorkMessageReplyWait2Panel.Instance != null && ServerWorkMessageReplyWait2Panel.Instance.isActiveAndEnabled) { isBusy = true; } //非忙碌中就直接跳轉 if (isBusy == false) { 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": { GameSticksResult msgObj = JsonUtility.FromJson(msg.payload); if (msgObj != null) { if (ServerGameSticksPanel.Instance) { ServerGameSticksPanel.Instance.OnReceivedResult(msgObj.angle); } } } 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}"); } } public void SendMessageTo2ndScreenClient(string action, string message) { if (CurrentConn2ndScreen != null && CurrentConn2ndScreen.isReady) { GameMessage msg = new GameMessage { action = action, payload = message }; CurrentConn2ndScreen.Send(msg); Debug.Log($"發送到2ndScreen客戶端: {message}"); } else { Debug.Log($"發送到2ndScreen客戶端失敗: {message}"); } } public void SendMessageTo2ndScreenServer(string action, string message) { if (CurrentConn2ndScreenServer != null && CurrentConn2ndScreenServer.isReady) { GameMessage msg = new GameMessage { action = action, payload = message }; CurrentConn2ndScreenServer.Send(msg); Debug.Log($"發送到2ndScreen伺服端: {message}"); } else { Debug.Log($"發送到2ndScreen伺服端失敗: {message}"); } } }