54 lines
2.2 KiB
C#
54 lines
2.2 KiB
C#
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<NetworkManager>();
|
|
transport = GetComponent<UnityTransport>();
|
|
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);
|
|
}
|
|
} |