165 lines
4.9 KiB
C#
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()
|
|
{
|
|
|
|
}
|
|
}
|