From 5c37b034385a48b14063c116e46e6fdeec8b9fcf Mon Sep 17 00:00:00 2001 From: qup35p <0528angelina@gmail.com> Date: Wed, 19 Nov 2025 22:01:06 +0800 Subject: [PATCH] =?UTF-8?q?<=E8=A7=A3=E6=B1=BAQ7>?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scripts/Server/NetworkMessageHandler.cs | 36 +++++++++++--- .../Server/ServerWorkMessageReplyExitPanel.cs | 48 +++++++++++++++++-- 2 files changed, 73 insertions(+), 11 deletions(-) diff --git a/Assets/Scripts/Server/NetworkMessageHandler.cs b/Assets/Scripts/Server/NetworkMessageHandler.cs index 2043f40..947a2bf 100644 --- a/Assets/Scripts/Server/NetworkMessageHandler.cs +++ b/Assets/Scripts/Server/NetworkMessageHandler.cs @@ -90,12 +90,20 @@ public class NetworkMessageHandler : MonoBehaviour } break; case "workProcess": - { - switch(msg.payload) + { + switch (msg.payload) { case "exit": - if (ServerWorkSceneController.Instance) + // ⭐ 修正點 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; @@ -109,7 +117,7 @@ public class NetworkMessageHandler : MonoBehaviour } break; case "gameSurvey": - { + { GameMessageSurvey msgObj = JsonUtility.FromJson(msg.payload); if (msgObj != null) @@ -118,11 +126,27 @@ public class NetworkMessageHandler : MonoBehaviour 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) { - //不用馬上跳場警,等到動畫結束自動跳場警 - //ServerWorkSceneController.Instance.processStep(10); + // 移除上次修正中新增的 processStep(10),改為呼叫雙重檢查。 + // 這是因為 gameSurvey 也是 Client 流程結束的訊號之一。 } + + // 讓 ServerWorkMessageReplyExitPanel 執行雙重檢查 + if (ServerWorkMessageReplyExitPanel.Instance) + { + Debug.Log("NetworkMessageHandler: 收到 gameSurvey 訊號,通知影片面板進行雙重檢查。"); + ServerWorkMessageReplyExitPanel.Instance.ReceiveClientSignal(); + } + + // 確保資料載入 if (ServerWorkMessageReplyExitSurveyPanel.Instance) { ServerWorkMessageReplyExitSurveyPanel.Instance.loadSurveyData(); diff --git a/Assets/Scripts/Server/ServerWorkMessageReplyExitPanel.cs b/Assets/Scripts/Server/ServerWorkMessageReplyExitPanel.cs index ea838bd..1d51bf8 100644 --- a/Assets/Scripts/Server/ServerWorkMessageReplyExitPanel.cs +++ b/Assets/Scripts/Server/ServerWorkMessageReplyExitPanel.cs @@ -1,4 +1,4 @@ -using System.Collections; +using System.Collections; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; @@ -12,14 +12,21 @@ public class ServerWorkMessageReplyExitPanel : MonoBehaviour public VideoPlayer videoPlayer; public RawImage videoDisplay; + // ⭐ 新增:雙重檢查旗標 + private bool isVideoFinished = false; + private bool isSignalReceived = false; + private void Awake() { Instance = this; } + void Start() { SetupVideoPlayer(); - + // ⭐ 重置狀態,確保每次啟動都是新的檢查 + isVideoFinished = false; + isSignalReceived = false; } public void play() @@ -42,7 +49,8 @@ public class ServerWorkMessageReplyExitPanel : MonoBehaviour { if (videoPlayer != null) { - // 設置影片結束事件 + // 設置影片結束事件,確保只訂閱一次 + videoPlayer.loopPointReached -= OnVideoFinished; videoPlayer.loopPointReached += OnVideoFinished; // 設置影片顯示 @@ -60,7 +68,37 @@ public class ServerWorkMessageReplyExitPanel : MonoBehaviour void OnVideoFinished(VideoPlayer vp) { Debug.Log("影片播放完成"); - ServerWorkSceneController.Instance.processStep(10); + // ⭐ 設置影片完成旗標 + isVideoFinished = true; + // ⭐ 嘗試切換場景 + TryProceedToNextStep(); } -} + // ⭐ 新增:接收 Client 訊號的方法 (由 NetworkMessageHandler 呼叫) + public void ReceiveClientSignal() + { + Debug.Log("收到 Client 的 Exit 訊號。"); + // ⭐ 設置訊號接收旗標 + isSignalReceived = true; + // ⭐ 嘗試切換場景 + TryProceedToNextStep(); + } + + // ⭐ 核心邏輯:只有在兩個條件都滿足時才切換場景 + private void TryProceedToNextStep() + { + // 只有當影片播放完成 (isVideoFinished) 且 Client 訊號已收到 (isSignalReceived) 時,才執行下一步驟。 + if (isVideoFinished && isSignalReceived) + { + Debug.Log("雙重檢查通過:影片和訊號皆已完成,切換到 Step 10。"); + if (ServerWorkSceneController.Instance != null) + { + ServerWorkSceneController.Instance.processStep(10); + } + } + else + { + Debug.Log($"等待另一個條件完成。狀態:影片完成={isVideoFinished}, 訊號接收={isSignalReceived}"); + } + } +} \ No newline at end of file