using FishNet.Connection; using FishNet.Managing; using FishNet.Object; using FishNet.Transporting; using Managers; using TMPro; using UnityEngine; public class GameInit : MonoBehaviour { [SerializeField] private GameObject systemsManagerPrefab; [SerializeField] private GameObject networkManagerPrefab; [SerializeField] private NetworkObject gameManagerPrefab; [SerializeField] private GameObject notificationPrefab; private NetworkManager _networkManager; public static GameInit Instance { get; set; } private void Awake() { InitializeSystemsManager(); InitializeNetworkManager(); _networkManager = FindObjectOfType(); if (_networkManager == null) Debug.LogError("NetworkManager not found"); // ensure this is singleton if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } private void Start() { if (_networkManager != null) { _networkManager.ServerManager.OnServerConnectionState += OnServerConnectionStateChange; _networkManager.ClientManager.OnClientConnectionState += OnClientConnectionStateChange; } } private void OnDestroy() { if (_networkManager != null) { _networkManager.ServerManager.OnServerConnectionState -= OnServerConnectionStateChange; _networkManager.ClientManager.OnClientConnectionState -= OnClientConnectionStateChange; _networkManager.ServerManager.OnRemoteConnectionState -= OnRemoteConnectionStateChange; //_networkManager.ClientManager.OnRemot } } private void OnRemoteConnectionStateChange(NetworkConnection arg1, RemoteConnectionStateArgs arg2) { } private void OnServerConnectionStateChange(ServerConnectionStateArgs args) { Debug.Log("Server Connection State Changed " + args.ConnectionState); // if (args.ConnectionState == LocalConnectionState.Started) InitializeGameManager(); } private void OnClientConnectionStateChange(ClientConnectionStateArgs args) { // InitializeGameManager(); string message = "Client Connection State Changed " + args.ConnectionState; Debug.Log(message); ShowNotification(message); } private void ShowNotification(string message) { } private void InitializeSystemsManager() { if (FindObjectOfType() == null) { var systemsManagerInstance = Instantiate(systemsManagerPrefab); DontDestroyOnLoad(systemsManagerInstance); } } private void InitializeNetworkManager() { if (FindObjectOfType() == null) { var networkManagerInstance = Instantiate(networkManagerPrefab); DontDestroyOnLoad(networkManagerInstance); } } public void InitializeGameManager() { Debug.Log("Initializing GameManager..."); if (FindObjectOfType() == null) { // check if gameManagerPrefab is null if (gameManagerPrefab == null) { Debug.LogError("GameManager prefab not found"); return; } var gameManagerInstance = Instantiate(gameManagerPrefab); // check if instance was created if (gameManagerInstance == null) { Debug.LogError("GameManager instance not found"); return; } _networkManager.ServerManager.Spawn(gameManagerInstance); // gameManagerInstance.SetActive(true); } } public NetworkObject GetGameManagerPrefab() { if (gameManagerPrefab == null) Debug.LogError("GameManager prefab not found"); return gameManagerPrefab; } }