Petition-to-the-Gods-V3/Assets/Scripts/The2ndScreen/The2ndScreenInitSceneController.cs

165 lines
4.9 KiB
C#

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 = "192.168.31.8";
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<TelepathyTransport>();
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()
{
}
}