using Unity.Services.Lobbies.Models; using UnityEngine; public sealed class MainMenuController : MonoBehaviour { private string joinCode = string.Empty; private string lanAddress = "127.0.0.1"; private string lanPort = NetworkSessionController.DefaultLanPort.ToString(); private string playerName = string.Empty; private string lanValidationMessage = string.Empty; private Vector2 lobbyScrollPosition; private void OnGUI() { NetworkSessionController session = NetworkSessionController.Instance; GUI.Box(new Rect(24, 24, 480, 700), string.Empty); GUILayout.BeginArea(new Rect(44, 44, 440, 660)); GUILayout.Label("FRIENDSLOP // MOUNTAIN FACTORY"); GUILayout.Space(10); if (session == null) { GUILayout.Label("Network bootstrap is unavailable."); GUILayout.EndArea(); return; } if (session.IsOnline) { GUILayout.Label(session.Status); GUILayout.EndArea(); return; } if (string.IsNullOrEmpty(playerName)) playerName = session.LocalPlayerName; GUILayout.Label("Player name"); playerName = GUILayout.TextField(playerName, 24); session.SetLocalPlayerName(playerName); GUILayout.Space(10); GUI.enabled = !session.IsBusy; GUILayout.Label("LAN // DIRECT CONNECTION"); GUILayout.BeginHorizontal(); GUILayout.Label("IP", GUILayout.Width(24)); lanAddress = GUILayout.TextField(lanAddress); GUILayout.Label("Port", GUILayout.Width(32)); lanPort = GUILayout.TextField(lanPort, GUILayout.Width(64)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("Start LAN Host", GUILayout.Height(32)) && TryReadLanPort(out ushort hostPort)) session.StartLanHost(hostPort); if (GUILayout.Button("Join LAN", GUILayout.Height(32)) && TryReadLanPort(out ushort clientPort)) session.StartLanClient(lanAddress, clientPort); GUILayout.EndHorizontal(); if (!string.IsNullOrEmpty(lanValidationMessage)) GUILayout.Label(lanValidationMessage); GUILayout.Space(12); GUILayout.Label("RELAY // ONLINE"); if (GUILayout.Button("Create Relay Host", GUILayout.Height(34))) _ = session.StartHostAsync(); GUILayout.Space(12); GUILayout.Label("Join by code"); joinCode = GUILayout.TextField(joinCode).ToUpperInvariant(); if (GUILayout.Button("Join via Relay", GUILayout.Height(30))) _ = session.StartClientAsync(joinCode); GUILayout.Space(14); GUILayout.BeginHorizontal(); GUILayout.Label("Open factories"); if (GUILayout.Button("Refresh", GUILayout.Width(90))) _ = session.RefreshPublicLobbiesAsync(); GUILayout.EndHorizontal(); lobbyScrollPosition = GUILayout.BeginScrollView(lobbyScrollPosition, GUILayout.Height(160)); foreach (Lobby lobby in session.PublicLobbies) { GUILayout.BeginHorizontal(GUI.skin.box); GUILayout.Label($"{lobby.Name} {lobby.Players.Count}/{lobby.MaxPlayers}", GUILayout.ExpandWidth(true)); GUI.enabled = !session.IsBusy && lobby.AvailableSlots > 0; if (GUILayout.Button("Join", GUILayout.Width(70))) _ = session.JoinPublicLobbyAsync(lobby.Id); GUI.enabled = !session.IsBusy; GUILayout.EndHorizontal(); } GUILayout.EndScrollView(); GUILayout.FlexibleSpace(); GUILayout.Label(session.Status); GUI.enabled = true; GUILayout.EndArea(); } private bool TryReadLanPort(out ushort port) { bool isValid = ushort.TryParse(lanPort, out port) && port > 0; lanValidationMessage = isValid ? string.Empty : "LAN port must be between 1 and 65535."; return isValid; } }