<Q7解決一半>
This commit is contained in:
parent
5c37b03438
commit
06f2677c2c
@ -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
|
||||
|
||||
@ -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<GameMessage>(OnClientMessageReceived);
|
||||
}
|
||||
|
||||
@ -54,9 +55,10 @@ public class NetworkMessageHandler : MonoBehaviour
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case "workMessage":
|
||||
{
|
||||
|
||||
|
||||
GameMessageWork msgObj = JsonUtility.FromJson<GameMessageWork>(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<GameMessageSurvey>(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)
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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()
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user