252 lines
10 KiB
C#
252 lines
10 KiB
C#
using UnityEngine;
|
||
using Mirror;
|
||
using UnityEngine.SceneManagement;
|
||
// 注意:Mirror.BouncyCastle.Tls.Crypto.Impl.BC; 這個 using 似乎是多餘的,但暫時保留。
|
||
|
||
public class NetworkMessageHandler : MonoBehaviour
|
||
{
|
||
public static NetworkMessageHandler Instance;
|
||
public static NetworkConnectionToClient CurrentConn;
|
||
// ⭐ 新增:用於記錄是否有未處理的 workMessage (跨場景緩存)
|
||
public bool hasPendingWorkMessage = false;
|
||
|
||
void Awake()
|
||
{
|
||
if (Instance == null)
|
||
{
|
||
Instance = this;
|
||
|
||
DontDestroyOnLoad(gameObject);
|
||
}
|
||
else
|
||
{
|
||
Destroy(gameObject);
|
||
}
|
||
}
|
||
|
||
private void Start()
|
||
{
|
||
NetworkServer.RegisterHandler<GameMessage>(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<GameMessageWork>(msg.payload);
|
||
|
||
if (msgObj != null)
|
||
{
|
||
// 關鍵修正 1:在切換 Panel 之前,先更新所有靜態數據 (保留)
|
||
ServerWorkMessagePanel.workMessageCount = msgObj.count;
|
||
ServerWorkMessagePanel.workMessage = msgObj.message;
|
||
ServerWorkMessagePanel.workMessageType = msgObj.type;
|
||
ServerWorkMessagePanel.workPresent = msgObj.present;
|
||
|
||
if (ServerWorkMessagePanel.workMessageCount != 0)
|
||
{
|
||
if (ServerWorkSceneController.Instance != null)
|
||
{
|
||
// 情況 1: ServerWorkScene 已經載入 (正常流程或影片播放完畢後)
|
||
|
||
// 檢查當前是否正在播放 Step 5 影片
|
||
if (ServerWorkMessageReplyWait1Panel.Instance != null && ServerWorkMessageReplyWait1Panel.Instance.gameObject.activeInHierarchy)
|
||
{
|
||
// 影片正在播放,暫存訊號 (邏輯保留)
|
||
ServerWorkMessageReplyWait1Panel.Instance.ReceiveClientSignal();
|
||
Debug.Log("WorkMessage 收到,但 Step 5 影片正在播放,延遲切換。");
|
||
}
|
||
else
|
||
{
|
||
// 影片未播放,直接切換到 Step 2 (MessagePanel)
|
||
ServerWorkSceneController.Instance.processStep(2);
|
||
Debug.Log("WorkMessage 收到,直接切換到 Step 2。");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// 情況 2: ServerWorkScene 尚未載入 (Server正在 Intro 影片中)
|
||
// 設置緩存旗標 (保留)
|
||
hasPendingWorkMessage = true;
|
||
Debug.Log("WorkMessage 收到,但 ServerWorkScene 尚未載入,設置緩存旗標。");
|
||
}
|
||
}
|
||
|
||
// ⭐ 移除此處的 onReceivedData() 呼叫
|
||
// 因為當場景流程切換到 Step 2 時,ServerWorkMessagePanel.OnEnable() 會自行處理。
|
||
/*
|
||
if (ServerWorkMessagePanel.Instance)
|
||
{
|
||
ServerWorkMessagePanel.Instance.onReceivedData();
|
||
}
|
||
*/
|
||
}
|
||
else
|
||
{
|
||
Debug.LogError("workMessage failed");
|
||
}
|
||
}
|
||
break; // 修正:這個 break 才是結束 case "workMessage" 的地方
|
||
case "workProcess":
|
||
{
|
||
switch (msg.payload)
|
||
{
|
||
case "exit":
|
||
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<GameMessageSurvey>(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(10);
|
||
}
|
||
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<GameMessageSurvey>(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":
|
||
{
|
||
// 這裡通常是空的 case 區塊
|
||
}
|
||
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}");
|
||
}
|
||
}
|
||
} |