Files
Northbound/Assets/Scripts/NetworkJoinUI.cs

270 lines
7.7 KiB
C#

using UnityEngine;
using UnityEngine.UI;
using Unity.Netcode;
namespace Northbound
{
public class NetworkJoinUI : MonoBehaviour
{
[Header("UI References")]
[SerializeField] private GameObject joinPanel;
[SerializeField] private InputField ipInputField;
[SerializeField] private InputField portInputField;
[SerializeField] private Button joinButton;
[SerializeField] private Button hostButton;
[SerializeField] private Button disconnectButton;
[SerializeField] private Text statusText;
[SerializeField] private KeyCode toggleKey = KeyCode.J;
[Header("Settings")]
[SerializeField] private string defaultIP = "127.0.0.1";
[SerializeField] private string defaultPort = "7777";
private bool _isVisible = false;
private void Awake()
{
InitializeUI();
}
private void Start()
{
SetupDefaultValues();
SubscribeToEvents();
UpdateStatus();
}
private void Update()
{
if (Input.GetKeyDown(toggleKey))
{
TogglePanel();
}
if (NetworkManager.Singleton != null &&
(NetworkManager.Singleton.IsClient || NetworkManager.Singleton.IsServer))
{
UpdateStatus();
}
}
private void InitializeUI()
{
if (joinPanel != null)
{
joinPanel.SetActive(false);
}
}
private void SetupDefaultValues()
{
if (ipInputField != null)
{
ipInputField.text = defaultIP;
}
if (portInputField != null)
{
portInputField.text = defaultPort;
}
}
private void SubscribeToEvents()
{
if (joinButton != null)
{
joinButton.onClick.AddListener(OnJoinClicked);
}
if (hostButton != null)
{
hostButton.onClick.AddListener(OnHostClicked);
}
if (disconnectButton != null)
{
disconnectButton.onClick.AddListener(OnDisconnectClicked);
}
}
private void UnsubscribeFromEvents()
{
if (joinButton != null)
{
joinButton.onClick.RemoveListener(OnJoinClicked);
}
if (hostButton != null)
{
hostButton.onClick.RemoveListener(OnHostClicked);
}
if (disconnectButton != null)
{
disconnectButton.onClick.RemoveListener(OnDisconnectClicked);
}
}
private void OnJoinClicked()
{
if (NetworkManager.Singleton == null)
{
ShowError("NetworkManager not found!");
return;
}
string ip = ipInputField != null ? ipInputField.text : defaultIP;
string port = portInputField != null ? portInputField.text : defaultPort;
ushort portNum;
if (!ushort.TryParse(port, out portNum))
{
ShowError("Invalid port number!");
return;
}
if (NetworkManager.Singleton.IsClient || NetworkManager.Singleton.IsServer)
{
ShowError("Already connected!");
return;
}
var transport = NetworkManager.Singleton.GetComponent<Unity.Netcode.Transports.UTP.UnityTransport>();
if (transport != null)
{
transport.SetConnectionData(ip, portNum);
}
NetworkManager.Singleton.StartClient();
UpdateStatus();
Debug.Log($"[NetworkJoinUI] Connecting to {ip}:{port}");
}
private void OnHostClicked()
{
if (NetworkManager.Singleton == null)
{
ShowError("NetworkManager not found!");
return;
}
string port = portInputField != null ? portInputField.text : defaultPort;
ushort portNum;
if (!ushort.TryParse(port, out portNum))
{
ShowError("Invalid port number!");
return;
}
if (NetworkManager.Singleton.IsClient || NetworkManager.Singleton.IsServer)
{
ShowError("Already connected!");
return;
}
var transport = NetworkManager.Singleton.GetComponent<Unity.Netcode.Transports.UTP.UnityTransport>();
if (transport != null)
{
transport.SetConnectionData("0.0.0.0", portNum);
}
NetworkManager.Singleton.StartHost();
UpdateStatus();
Debug.Log($"[NetworkJoinUI] Started Host on port {port}");
}
private void OnDisconnectClicked()
{
if (NetworkManager.Singleton != null)
{
NetworkManager.Singleton.Shutdown();
UpdateStatus();
Debug.Log("[NetworkJoinUI] Disconnected");
}
}
private void UpdateStatus()
{
if (statusText == null) return;
string status = GetNetworkStatus();
statusText.text = status;
}
private string GetNetworkStatus()
{
if (NetworkManager.Singleton == null)
return "NetworkManager not found";
if (NetworkManager.Singleton.IsHost)
return $"Hosting (Port: {GetActivePort()})";
if (NetworkManager.Singleton.IsServer)
return $"Server (Port: {GetActivePort()})";
if (NetworkManager.Singleton.IsClient)
return $"Client connected to {GetActiveIP()}:{GetActivePort()}";
return "Not connected";
}
private string GetActiveIP()
{
if (NetworkManager.Singleton == null) return "N/A";
var transport = NetworkManager.Singleton.GetComponent<Unity.Netcode.Transports.UTP.UnityTransport>();
if (transport != null)
{
return transport.ConnectionData.Address;
}
return "N/A";
}
private string GetActivePort()
{
if (NetworkManager.Singleton == null) return "N/A";
var transport = NetworkManager.Singleton.GetComponent<Unity.Netcode.Transports.UTP.UnityTransport>();
if (transport != null)
{
return transport.ConnectionData.Port.ToString();
}
return "N/A";
}
private void TogglePanel()
{
if (joinPanel != null)
{
_isVisible = !_isVisible;
joinPanel.SetActive(_isVisible);
UpdateStatus();
}
}
private void ShowError(string message)
{
Debug.LogError($"[NetworkJoinUI] {message}");
if (statusText != null)
{
statusText.text = $"Error: {message}";
}
}
private void OnDestroy()
{
UnsubscribeFromEvents();
}
public void SetUIReferences(GameObject panel, InputField ipField, InputField portField, Button joinBtn, Button hostBtn, Button disconnectBtn, Text status)
{
joinPanel = panel;
ipInputField = ipField;
portInputField = portField;
joinButton = joinBtn;
hostButton = hostBtn;
disconnectButton = disconnectBtn;
statusText = status;
}
}
}