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

157 lines
3.9 KiB
C#

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using Mirror;
using System.Collections;
using TMPro;
public class ClientHomeWaittingSceneController : MonoBehaviour
{
public static ClientHomeWaittingSceneController Instance;
[Header("UI 元件")]
public TMP_Text statusText;
private bool isConnecting = false;
private bool welcomeReceived = false;
void Awake()
{
Instance = this;
}
void Start()
{
SetupScene();
StartCoroutine(ConnectToServer());
}
void SetupScene()
{
if (ClientGlobalMenuManager.Instance != null)
{
ClientGlobalMenuManager.Instance.menuButton.SetActive(true);
}
if (statusText != null)
{
statusText.text = "等待神明的降臨";
}
}
IEnumerator ConnectToServer()
{
isConnecting = true;
if (statusText != null)
{
statusText.text = "等待神明的降臨.";
}
// 設置 NetworkManager
if (ClientNetworkManager.Instance != null)
{
//ClientNetworkManager.Instance.StopClient();
ClientNetworkManager.Instance.networkAddress = ClientInitSceneController.ServerAddr;
// 使用 Telepathy (TCP) Transport
TelepathyTransport transport = ClientNetworkManager.Instance.GetComponent<TelepathyTransport>();
if (transport != null)
{
transport.port = ClientInitSceneController.ServerPort;
}
// 開始連線
ClientNetworkManager.Instance.StartClient();
Debug.Log($"開始連線到 {ClientInitSceneController.ServerAddr}:{ClientInitSceneController.ServerPort}");
}
// 等待連線
float timeout = 3f;
float elapsed = 0f;
while (!NetworkClient.isConnected && elapsed < timeout)
{
elapsed += Time.deltaTime;
yield return null;
}
if (NetworkClient.isConnected)
{
Debug.Log("連線成功!等待 Welcome 訊息...");
if (statusText != null)
{
statusText.text = "等待神明的降臨..";
}
// send welcome
if (ClientMessageHandler.Instance != null)
{
ClientMessageHandler.Instance.RegisterHandler();
ClientMessageHandler.Instance.SendMessageToServer("welcome", "hello");
}
// 等待 Welcome 訊息
yield return StartCoroutine(WaitForWelcomeMessage());
}
else
{
Debug.LogError("連線失敗!");
if (statusText != null)
{
statusText.text = "等待神明的降臨...!";
}
isConnecting = false;
yield return StartCoroutine(ConnectToServer());
}
}
IEnumerator WaitForWelcomeMessage()
{
float timeout = 3f;
float elapsed = 0f;
while (!welcomeReceived && elapsed < timeout)
{
elapsed += Time.deltaTime;
yield return null;
}
if (!welcomeReceived)
{
Debug.LogError("未收到 Welcome 訊息!");
if (statusText != null)
{
statusText.text = "等待神明的降臨...!!";
}
isConnecting = false;
yield return StartCoroutine(ConnectToServer());
}
}
public void OnWelcomeMessageReceived()
{
welcomeReceived = true;
Debug.Log("Welcome 訊息已驗證,準備跳轉場景");
if (statusText != null)
{
statusText.text = "等待神明的降臨...";
}
StartCoroutine(LoadIntroScene());
}
IEnumerator LoadIntroScene()
{
yield return new WaitForSeconds(0f);
SceneManager.LoadScene("ClientIntroScene");
}
}