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.