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(); 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(); 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(); 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(); 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; } } }