157 lines
3.9 KiB
C#
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");
|
|
}
|
|
} |