using Unity.Netcode; using Unity.Netcode.Transports.UTP; using UnityEngine; using UnityEngine.SceneManagement; [RequireComponent(typeof(NetworkManager), typeof(UnityTransport))] public sealed class FriendslopSession : MonoBehaviour { public static FriendslopSession Instance { get; private set; } [SerializeField] private NetworkObject playerPrefab; [SerializeField] private string menuScene = "MainMenu"; [SerializeField] private string gameplayScene = "Factory"; public string Status { get; private set; } = "Ready."; public bool IsOnline => NetworkManager.Singleton != null && NetworkManager.Singleton.IsListening; private NetworkManager manager; private UnityTransport transport; private void Awake() { if (Instance != null) { Destroy(gameObject); return; } Instance = this; DontDestroyOnLoad(gameObject); manager = GetComponent(); transport = GetComponent(); manager.NetworkConfig.NetworkTransport = transport; manager.NetworkConfig.PlayerPrefab = playerPrefab.gameObject; manager.NetworkConfig.EnableSceneManagement = true; manager.OnServerStarted += LoadGameplayForHost; } private void Start() => SceneManager.LoadScene(menuScene); private void OnDestroy() { if (manager != null) manager.OnServerStarted -= LoadGameplayForHost; if (Instance == this) Instance = null; } public bool StartHost(ushort port) { transport.SetConnectionData("0.0.0.0", port, "0.0.0.0"); Status = manager.StartHost() ? $"Host started on {port}." : "Host failed to start."; return manager.IsHost; } public bool StartClient(string address, ushort port) { transport.SetConnectionData(address.Trim(), port); bool started = manager.StartClient(); Status = started ? $"Connecting to {address}:{port}..." : "Client failed to start."; return started; } private void LoadGameplayForHost() { Status = "Loading factory..."; manager.SceneManager.LoadScene(gameplayScene, LoadSceneMode.Single); } }