Netcode for GO Client auto disconnect after almost 1 min

Hi guys,
I’m building my multiplayer game, and I saw a problem in my game. I don’t know how to fix it.
When a client joins a game, the connection will disconnect after maybe 1 minute?

This is my pattern. I used “Controller” to transmit the RPC method and data.

public class NetworkController : NetworkBehaviour, IController
    {
        private FacepunchTransport _transport;
        private int _connectionCount;
        private Dictionary<ulong, ulong> _connections = new();
        private readonly object _lock = new();

        public UniTask Init()
        {
            FacepunchTransport = NetworkManager.GetComponent<FacepunchTransport>();
            NetworkManager.OnServerStarted += OnServerStarted;
            NetworkManager.OnClientStarted += OnClientStarted;
            NetworkManager.OnClientConnectedCallback += OnClientConnected;
            NetworkManager.OnClientDisconnectCallback += OnClientDisconnected;
            GameLog.Log($"Init.",
                "NetworkController",
                Color.green);
            return default;
        }

        public UniTask Release()
        {
            _connections.Clear();
            NetworkManager.OnServerStarted -= OnServerStarted;
            NetworkManager.OnClientStarted -= OnClientStarted;
            NetworkManager.OnClientDisconnectCallback -= OnClientDisconnected;
            NetworkManager.OnClientConnectedCallback -= OnClientConnected;
            return default;
        }


        public FacepunchTransport FacepunchTransport
        {
            get => _transport;
            set => _transport = value;
        }

        public int ConnectionCount
        {
            get
            {
                if (_connectionCount > 1) return _connectionCount;
                return 4;
            }
            set => _connectionCount = value;
        }

        public Dictionary<ulong, ulong> Connections => _connections;


        public void StartHost()
        {
            NetworkManager.StartHost();
        }

        public void StartClient(SteamId steamId)
        {
            _transport.targetSteamId = steamId;
            if (NetworkManager.StartClient())
            {
                GameLog.Log($"Client has started.",
                    "NetworkController",
                    Color.yellow);
            }
        }

        public void Disconnected()
        {
            if (!NetworkManager.IsListening) return;
            NetworkManager.Shutdown(true);
            GameLog.Log($"Disconnected.",
                "NetworkController",
                Color.yellow);
        }

        private void OnServerStarted()
        {
            GameLog.Log($"Server Started.",
                "NetworkController",
                Color.yellow);
        }

        private void OnClientStarted()
        {
            GameLog.Log($"Client started.",
                "NetworkController",
                Color.yellow);
        }

        private void OnClientConnected(ulong connId)
        {
            if (_connections.Values.Contains(SteamClient.SteamId)) return;

            GameLog.Log($"Client connected {connId}@{SteamClient.SteamId}",
                "NetworkController",
                Color.yellow);
            ClientConnectedServerRpc(connId, SteamClient.SteamId);
        }

        [Rpc(SendTo.Server)]
        private void ClientConnectedServerRpc(ulong connId, ulong steamId)
        {
            bool success = _connections.TryAdd(connId, steamId);
            Game.Instance.PlayerController.AddPlayer(connId, steamId);
            Game.Instance.LobbyController.CreateLobbyMember(connId, steamId);
            GameLog.Log(
                $"Add conn {success}: {connId}@{steamId}. Connection Count: {_connections.Count}",
                "NetworkController/ClientConnectedServerRpc",
                Color.yellow);
            foreach (var kv in _connections)
            {
                UpdateConnectionClientRpc(kv.Key, kv.Value);
            }
        }

        [Rpc(SendTo.NotServer)]
        private void UpdateConnectionClientRpc(ulong connId, ulong steamId)
        {
            bool addConnSuccess = _connections.TryAdd(connId, steamId);
            Game.Instance.PlayerController.AddPlayer(connId, steamId);
            Game.Instance.SceneController.AddClientSceneRpc(connId, SceneType.MAIN_MENU);
            GameLog.Log($"Connection add {addConnSuccess}: {connId}. Client id: {steamId}.",
                "NetworkController/UpdateConnectionClientRpc",
                Color.yellow);
            Game.Instance.LobbyController.CreateLobbyMemberNotServerRpc(connId, steamId);
        }

        private void OnClientDisconnected(ulong connId)
        {
            ClientPlayerDisconnectedServerRpc(connId);
            GameLog.LogWarning($"Client disconnected {connId}.",
                "NetworkController",
                Color.yellow);
        }

        [Rpc(SendTo.Server)]
        private void ClientPlayerDisconnectedServerRpc(ulong connId)
        {
            Game.Instance.PlayerController.RemovePlayer(connId);
        }

        private void OnApplicationQuit()
        {
            Disconnected();
        }
    }

This is my custom NetworkController function.

Please post code as text, not screenshots. Screenshotted code is not quotable, not searchable, hard to read and this background color in particular is terrible on the eyes (try dark mode).

All I can tell from the code is that you’re trying to implement householding tasks that NGO already provides to you. At least OnClientDisconnected should not send an RPC in general - the client is already disconnected! The server runs a corresponding client disconnected event.

The same goes for connection, here you should send the steamId along with the client’s connection payload and implement connection approval on the server side.

Do you get any events? If so which ones in what order? Are you sure the client isn’t running Shutdown for instance?

Also be sure to implement OnTransportFailure because this can always occur and will shut down the network session, so the app needs to handle this case.

Yes, normally it did not listened to that action. In my project when a client disconnect, I need remove the gameObject and the data in SomeController. My gameObject didn’t implement NetworkBehaviour and NetowrkObject.


This is my first test.


And this is my second test.

Seems like between 1 - 2 minutes the client will lose the connection.

I’ll try this to test my project!