using Mirror; using System; using System.Collections; using TMPro; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; public class The2ndScreenInitSceneController : MonoBehaviour { public static The2ndScreenInitSceneController Instance = null; public static string role = ""; public static string serverAddr = ""; public static string serverPort = ""; public GameObject panel; public TMP_InputField serverAddrInput; public TMP_InputField serverPortInput; public Button Server2ndButton; public Button Client2ndButton; public TMP_Text statusText; private bool welcomeReceived = false; private void Awake() { Instance = this; } // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { serverAddrInput.text = "127.0.0.1"; serverPortInput.text = "17777"; Server2ndButton.onClick.AddListener(Server2ndButton_onClick); Client2ndButton.onClick.AddListener(Client2ndButton_onClick); } private void Client2ndButton_onClick() { panel.SetActive(false); role = "The2ndScreenClient"; serverAddr = serverAddrInput.text; serverPort = serverPortInput.text; StartCoroutine(ConnectToServer()); } private void Server2ndButton_onClick() { panel.SetActive(false); role = "The2ndScreenServer"; serverAddr = serverAddrInput.text; serverPort = serverPortInput.text; StartCoroutine(ConnectToServer()); } public void OnReceivedWelcome() { welcomeReceived = true; } IEnumerator ConnectToServer() { // 設置 NetworkManager if (The2ndScreenNetworkManager.Instance != null) { The2ndScreenNetworkManager.Instance.networkAddress = The2ndScreenInitSceneController.serverAddr; // 使用 Telepathy (TCP) Transport TelepathyTransport transport = The2ndScreenNetworkManager.Instance.GetComponent(); if (transport != null) { transport.port = ushort.Parse(The2ndScreenInitSceneController.serverPort); } // 開始連線 The2ndScreenNetworkManager.Instance.StartClient(); statusText.text = $"開始連線到 {The2ndScreenInitSceneController.serverAddr}:{The2ndScreenInitSceneController.serverPort}"; Debug.Log($"開始連線到 {The2ndScreenInitSceneController.serverAddr}:{The2ndScreenInitSceneController.serverPort}"); } // 等待連線 float timeout = 3f; float elapsed = 0f; while (!NetworkClient.isConnected && elapsed < timeout) { elapsed += Time.deltaTime; yield return null; } if (NetworkClient.isConnected) { Debug.Log("連線成功!等待 Welcome 訊息..."); statusText.text = $"連線成功!等待 Welcome 訊息..."; // send welcome if (The2ndScreenMessageHandler.Instance != null) { //The2ndScreenMessageHandler.Instance.RegisterHandler(); The2ndScreenMessageHandler.Instance.SendMessageToServer("welcome", The2ndScreenInitSceneController.role); } // 等待 Welcome 訊息 yield return StartCoroutine(WaitForWelcomeMessage()); } else { Debug.LogError("連線失敗!"); statusText.text = $"連線失敗!"; panel.SetActive(true); //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 訊息!"); statusText.text = $"未收到 Welcome 訊息!"; panel.SetActive(true); //yield return StartCoroutine(ConnectToServer()); } else { if (The2ndScreenInitSceneController.role == "The2ndScreenServer") { statusText.text = $"跳到神明第2畫面"; yield return StartCoroutine(LoadNextScene("The2ndScreenServerScene")); } else if (The2ndScreenInitSceneController.role == "The2ndScreenClient") { statusText.text = $"跳到信眾第2畫面"; yield return StartCoroutine(LoadNextScene("The2ndScreenClientScene")); } } } IEnumerator LoadNextScene(string name) { yield return new WaitForSeconds(0f); SceneManager.LoadScene(name); } // Update is called once per frame void Update() { } }