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