Petition-to-the-Gods-V3/Assets/Scripts/Client/ClientMessageHandler.cs
2025-11-18 14:54:11 +08:00

128 lines
4.3 KiB
C#

using UnityEngine;
using Mirror;
using System;
public class ClientMessageHandler : MonoBehaviour
{
public static ClientMessageHandler Instance;
void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
public void RegisterHandler()
{
NetworkClient.RegisterHandler<GameMessage>(OnServerMessageReceived);
}
public void UnregisterHandler()
{
NetworkClient.UnregisterHandler<GameMessage>();
}
void OnServerMessageReceived(GameMessage msg)
{
Debug.Log($"收到 Server 訊息: {msg.action} {msg.payload}");
try
{
switch (msg.action)
{
case "welcome":
{
switch(msg.payload)
{
case "hello":
Debug.Log("Welcome 訊息驗證成功");
// clean data
ClientWorkMessageHandleSceneController.cleanData();
ClientWorkMessageHandleSceneController.messageResultCount = 0;
ClientLastWordsSceneController.words = "";
if (ClientHomeWaittingSceneController.Instance != null)
{
ClientHomeWaittingSceneController.Instance.OnWelcomeMessageReceived();
}
break;
}
}
break;
case "workMessageResult":
{
if (ClientWorkMessageHandleSceneController.Instance != null)
{
GameMessageWorkResult resultObj = JsonUtility.FromJson<GameMessageWorkResult>(msg.payload);
ClientWorkMessageHandleSceneController.messageResultCount = resultObj.count;
if (resultObj != null)
{
ClientWorkMessageHandleSceneController.Instance.onReceiveResult(resultObj.result, resultObj.resultText);
}
else
{
Debug.LogError("workMessaggeResult failed");
}
}
}
break;
case "gameFinalWords":
{
if (string.IsNullOrEmpty(ClientLastWordsSceneController.words))
{
ClientLastWordsSceneController.words = msg.payload;
if (ClientGameBackToRealSceneController.Instance)
{
StartCoroutine( ClientGameBackToRealSceneController.Instance.LoadNextScene());
}
}
}
break;
case "gameTalkingStart":
{
if (ClientGameTalkingSceneController.Instance)
{
ClientGameTalkingSceneController.Instance.processStep(2);
}
}
break;
case "gameTalkingGodSay":
{
if (ClientGameTalkingSceneController.Instance)
{
ClientGameTalkingSceneController.Instance.onReceivedChatMessage(msg.payload);
}
}
break;
}
}
catch (Exception e)
{
Debug.LogError($"解析 JSON 失敗: {e.Message}");
}
}
public void SendMessageToServer(string action, string message)
{
if (NetworkClient.isConnected)
{
GameMessage msg = new GameMessage { action = action, payload = message };
NetworkClient.Send(msg);
Debug.Log($"發送訊息到 Server: {message}");
}
else
{
Debug.LogError($"發送訊息到 Server 失敗: {message}");
}
}
}