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(); 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"); } }