From 06f2677c2c297abf537f0846e2813e79026140c9 Mon Sep 17 00:00:00 2001 From: qup35p <0528angelina@gmail.com> Date: Wed, 19 Nov 2025 23:12:17 +0800 Subject: [PATCH] =?UTF-8?q??= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scenes/Server/ServerWorkScene.unity | 2 +- .../Scripts/Server/NetworkMessageHandler.cs | 70 ++++++++++--------- .../ServerWorkMessageReplyWait1Panel.cs | 43 ++++++++++-- ...ServerWorkMessageReplyWait1WorkingPanel.cs | 16 ++++- 4 files changed, 91 insertions(+), 40 deletions(-) diff --git a/Assets/Scenes/Server/ServerWorkScene.unity b/Assets/Scenes/Server/ServerWorkScene.unity index 0596f7a..db168e0 100644 --- a/Assets/Scenes/Server/ServerWorkScene.unity +++ b/Assets/Scenes/Server/ServerWorkScene.unity @@ -16485,7 +16485,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 2.1308594, y: 42.619263} + m_AnchoredPosition: {x: 2.1308594, y: 42.61914} m_SizeDelta: {x: -76.715, y: -136.381} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1165523629 diff --git a/Assets/Scripts/Server/NetworkMessageHandler.cs b/Assets/Scripts/Server/NetworkMessageHandler.cs index 947a2bf..3c645e9 100644 --- a/Assets/Scripts/Server/NetworkMessageHandler.cs +++ b/Assets/Scripts/Server/NetworkMessageHandler.cs @@ -1,18 +1,18 @@ using UnityEngine; using Mirror; -using Mirror.BouncyCastle.Tls.Crypto.Impl.BC; - +// 移除 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 @@ -23,6 +23,7 @@ public class NetworkMessageHandler : MonoBehaviour private void Start() { + // 確保已經註冊了處理 GameMessage 的 Handler NetworkServer.RegisterHandler(OnClientMessageReceived); } @@ -54,9 +55,10 @@ public class NetworkMessageHandler : MonoBehaviour } } break; + case "workMessage": { - + GameMessageWork msgObj = JsonUtility.FromJson(msg.payload); if (msgObj != null) { @@ -65,19 +67,37 @@ public class NetworkMessageHandler : MonoBehaviour ServerWorkMessagePanel.workPresent = msgObj.present; ServerWorkMessagePanel.workMessageCount = msgObj.count; - if (ServerWorkMessagePanel.workMessageCount != 0) + // 1. 鎖定檢查:影片是否正在播放 (Step 5) + if (ServerWorkMessageReplyWait1Panel.Instance != null) { - if (ServerWorkSceneController.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 + } + else { //動畫還沒結束,先放到預先準備資料中 ServerWorkMessagePanel.prepareData = msgObj; @@ -89,21 +109,20 @@ public class NetworkMessageHandler : MonoBehaviour } } break; + case "workProcess": { switch (msg.payload) { case "exit": - // ⭐ 修正點 1: 處理 workProcess/exit - // 不再直接呼叫 processStep(9) 或 (10)。改為發送訊號給 Panel,讓 Panel 執行雙重檢查。 + // Step 9 (Exit Panel) 雙重檢查邏輯 if (ServerWorkMessageReplyExitPanel.Instance) { - Debug.Log("NetworkMessageHandler: 收到 workProcess/exit 訊號,通知影片面板。"); + Debug.Log("NetworkMessageHandler: 收到 workProcess/exit 訊號,通知 Exit 影片面板。"); ServerWorkMessageReplyExitPanel.Instance.ReceiveClientSignal(); } else if (ServerWorkSceneController.Instance) { - // 備用機制:如果 Panel 不存在,則直接跳轉。 ServerWorkSceneController.Instance.processStep(9); } break; @@ -116,6 +135,7 @@ public class NetworkMessageHandler : MonoBehaviour } } break; + case "gameSurvey": { GameMessageSurvey msgObj = JsonUtility.FromJson(msg.payload); @@ -127,25 +147,12 @@ public class NetworkMessageHandler : MonoBehaviour 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 執行雙重檢查 + // Step 9 (Exit Panel) 雙重檢查邏輯 if (ServerWorkMessageReplyExitPanel.Instance) { - Debug.Log("NetworkMessageHandler: 收到 gameSurvey 訊號,通知影片面板進行雙重檢查。"); + Debug.Log("NetworkMessageHandler: 收到 gameSurvey 訊號,通知 Exit 影片面板進行雙重檢查。"); ServerWorkMessageReplyExitPanel.Instance.ReceiveClientSignal(); } - // 確保資料載入 if (ServerWorkMessageReplyExitSurveyPanel.Instance) { @@ -154,9 +161,10 @@ public class NetworkMessageHandler : MonoBehaviour } } break; + case "gameProcess": { - + // 保持不變 } break; case "gameOpen": @@ -177,7 +185,7 @@ public class NetworkMessageHandler : MonoBehaviour } break; case "getWords": - { + { if (ServerWorkSceneController.Instance) { ServerWorkSceneController.Instance.processStep(18); @@ -225,12 +233,10 @@ public class NetworkMessageHandler : MonoBehaviour break; case "gameSticksFinish": { - + // 保持不變 } break; } - - } public void SendMessageToClient(string action, string message) diff --git a/Assets/Scripts/Server/ServerWorkMessageReplyWait1Panel.cs b/Assets/Scripts/Server/ServerWorkMessageReplyWait1Panel.cs index 70f21a3..c9d7158 100644 --- a/Assets/Scripts/Server/ServerWorkMessageReplyWait1Panel.cs +++ b/Assets/Scripts/Server/ServerWorkMessageReplyWait1Panel.cs @@ -1,4 +1,4 @@ -using System.Collections; +using System.Collections; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; @@ -12,6 +12,9 @@ public class ServerWorkMessageReplyWait1Panel : MonoBehaviour public VideoPlayer videoPlayer; public RawImage videoDisplay; + // ⭐【新增旗標】:追蹤是否收到「切換到 Step 2 (新願望)」的指令 + private bool shouldGoToStep2 = false; + private void Awake() { Instance = this; @@ -19,7 +22,8 @@ public class ServerWorkMessageReplyWait1Panel : MonoBehaviour void Start() { SetupVideoPlayer(); - + // 重設旗標,確保每次播放都是從初始狀態開始 + shouldGoToStep2 = false; } public void play() @@ -27,6 +31,7 @@ public class ServerWorkMessageReplyWait1Panel : MonoBehaviour if (videoPlayer != null) { videoPlayer.Play(); + Debug.Log("ServerWorkMessageReplyWait1Panel: 開始播放影片 (Step 5)。"); } } @@ -45,7 +50,7 @@ public class ServerWorkMessageReplyWait1Panel : MonoBehaviour // 設置影片結束事件 videoPlayer.loopPointReached += OnVideoFinished; - // 設置影片顯示 + // 設置影片顯示 (略) if (videoDisplay != null) { videoPlayer.targetTexture = null; @@ -57,10 +62,36 @@ public class ServerWorkMessageReplyWait1Panel : MonoBehaviour } } + // 影片播放結束時呼叫 void OnVideoFinished(VideoPlayer vp) { - Debug.Log("影片播放完成"); - ServerWorkSceneController.Instance.processStep(6); + Debug.Log("ServerWorkMessageReplyWait1Panel: 影片播放完成。"); + + // ⭐【核心邏輯修正】:檢查是否有暫存的「新願望」指令 + if (shouldGoToStep2) + { + // ✅ 修正點:如果收到新願望,切換到 Step 2 (MessagePanel) + Debug.Log("ServerWorkMessageReplyWait1Panel: 收到新願望訊號,切換到 Step 2 (MessagePanel)。"); + if (ServerWorkSceneController.Instance != null) + { + ServerWorkSceneController.Instance.processStep(2); // **切換到 Step 2** + } + } + else + { + // 正常流程:沒有新願望訊號,切換到 Step 6 (Wait1WorkingPanel) + Debug.Log("ServerWorkMessageReplyWait1Panel: 無新願望訊號,切換到 Step 6 (Wait1WorkingPanel)。"); + if (ServerWorkSceneController.Instance != null) + { + ServerWorkSceneController.Instance.processStep(6); + } + } } -} + // 供 NetworkMessageHandler 呼叫,設定「鎖定」旗標 + public void ReceiveNewWorkMessage() + { + Debug.Log("ServerWorkMessageReplyWait1Panel: 收到來自客戶端的新願望訊號,設定鎖定旗標。"); + shouldGoToStep2 = true; + } +} \ No newline at end of file diff --git a/Assets/Scripts/Server/ServerWorkMessageReplyWait1WorkingPanel.cs b/Assets/Scripts/Server/ServerWorkMessageReplyWait1WorkingPanel.cs index 09ec369..0763e29 100644 --- a/Assets/Scripts/Server/ServerWorkMessageReplyWait1WorkingPanel.cs +++ b/Assets/Scripts/Server/ServerWorkMessageReplyWait1WorkingPanel.cs @@ -1,4 +1,4 @@ -using UnityEngine; +using UnityEngine; using UnityEngine.UI; using UnityEngine.Video; @@ -15,6 +15,20 @@ public class ServerWorkMessageReplyWait1WorkingPanel : MonoBehaviour Instance = this; } + public void StopWaitingAndGoToMessagePanel() + { + // 立即停止所有動畫或協程 (如果有的話) + // StopAllCoroutines(); + // ... + + // 強制切換到 Step 2 + if (ServerWorkSceneController.Instance != null) + { + Debug.Log("ServerWorkMessageReplyWait1WorkingPanel: 收到新願望訊號,強制切換到 Step 2。"); + ServerWorkSceneController.Instance.processStep(2); + } + } + // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() {