Skip to content

Commit ac49f7c

Browse files
committed
Used inheritance to simplify Reconnecting state
* Reconnecting now inherits from Offline * Also extracted GetPlayerId() to Offline state (cherry picked from commit 4f1c105)
1 parent 523e077 commit ac49f7c

File tree

4 files changed

+81
-66
lines changed

4 files changed

+81
-66
lines changed

Assets/Scripts/Gameplay/ConnectionManagement/ConnectionManager.cs

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@
77
using Unity.Multiplayer.Samples.BossRoom.Shared;
88
using Unity.Multiplayer.Samples.BossRoom.Shared.Infrastructure;
99
using Unity.Multiplayer.Samples.BossRoom.Shared.Net.UnityServices.Lobbies;
10-
using Unity.Multiplayer.Samples.Utilities;
1110
using Unity.Netcode;
12-
using Unity.Services.Authentication;
13-
using Unity.Services.Core;
1411
using UnityEngine;
1512

1613
namespace Unity.Multiplayer.Samples.BossRoom
@@ -76,10 +73,10 @@ void Start()
7673
{
7774
m_Logics = new Dictionary<ConnectionStateType, ConnectionState>()
7875
{
79-
[ConnectionStateType.Offline] = new OfflineConnectionState(this, m_LobbyServiceFacade, m_LocalLobby),
76+
[ConnectionStateType.Offline] = new OfflineConnectionState(this, m_LobbyServiceFacade, m_LocalLobby, m_ProfileManager),
8077
[ConnectionStateType.Connecting] = new ConnectingConnectionState(this, m_QuitGameSessionPublisher, m_ConnectStatusPublisher),
8178
[ConnectionStateType.Connected] = new ConnectedConnectionState(this, m_QuitGameSessionPublisher, m_ConnectStatusPublisher),
82-
[ConnectionStateType.Reconnecting] = new ReconnectingConnectionState(this, m_LobbyServiceFacade, m_LocalLobby, m_ReconnectMessagePublisher),
79+
[ConnectionStateType.Reconnecting] = new ReconnectingConnectionState(this, m_LobbyServiceFacade, m_LocalLobby, m_ReconnectMessagePublisher, m_ProfileManager),
8380
[ConnectionStateType.Hosting] = new HostingConnectionState(this, m_LobbyServiceFacade, m_ConnectionEventPublisher)
8481
};
8582
m_CurrentState = ConnectionStateType.Offline;
@@ -135,22 +132,22 @@ void ApprovalCheck(byte[] connectionData, ulong clientId, NetworkManager.Connect
135132

136133
public Task StartClientLobbyAsync(string playerName, Action<string> onFailure)
137134
{
138-
return m_Logics[m_CurrentState].StartClientLobbyAsync(playerName, GetPlayerId(), onFailure);
135+
return m_Logics[m_CurrentState].StartClientLobbyAsync(playerName, onFailure);
139136
}
140137

141138
public void StartClientIp(string playerName, string ipaddress, int port)
142139
{
143-
m_Logics[m_CurrentState].StartClientIP(GetPlayerId(), playerName, ipaddress, port);
140+
m_Logics[m_CurrentState].StartClientIP(playerName, ipaddress, port);
144141
}
145142

146143
public void StartHostLobby(string playerName)
147144
{
148-
m_Logics[m_CurrentState].StartHostLobbyAsync(GetPlayerId(), playerName);
145+
m_Logics[m_CurrentState].StartHostLobbyAsync(playerName);
149146
}
150147

151148
public bool StartHostIp(string playerName, string ipaddress, int port)
152149
{
153-
return m_Logics[m_CurrentState].StartHostIP(GetPlayerId(), playerName, ipaddress, port);
150+
return m_Logics[m_CurrentState].StartHostIP(playerName, ipaddress, port);
154151
}
155152

156153
public void RequestShutdown()
@@ -198,15 +195,5 @@ public static void SendServerToClientSetDisconnectReason(ulong clientID, Connect
198195
writer.WriteValueSafe(status);
199196
NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage(nameof(ClientGameNetPortal.ReceiveServerToClientSetDisconnectReason_CustomMessage), clientID, writer);
200197
}
201-
202-
string GetPlayerId()
203-
{
204-
if (UnityServices.State != ServicesInitializationState.Initialized)
205-
{
206-
return ClientPrefs.GetGuid() + m_ProfileManager.Profile;
207-
}
208-
209-
return AuthenticationService.Instance.IsSignedIn ? AuthenticationService.Instance.PlayerId : ClientPrefs.GetGuid() + m_ProfileManager.Profile;
210-
}
211198
}
212199
}

Assets/Scripts/Gameplay/ConnectionManagement/ConnectionState/ConnectionState.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,19 @@ public ConnectionState(ConnectionManager connectionManager)
2020
public virtual void OnClientConnected(ulong clientId) {}
2121
public virtual void OnClientDisconnect(ulong clientId) {}
2222

23-
public virtual void StartClientIP(string playerId, string playerName, string ipaddress, int port) {}
23+
public virtual void StartClientIP(string playerName, string ipaddress, int port) {}
2424

25-
public virtual Task StartClientLobbyAsync(string playerName, string playerId, Action<string> onFailure)
25+
public virtual Task StartClientLobbyAsync(string playerName, Action<string> onFailure)
2626
{
2727
return Task.CompletedTask;
2828
}
2929

30-
public virtual bool StartHostIP(string playerId, string playerName, string ipaddress, int port)
30+
public virtual bool StartHostIP(string playerName, string ipaddress, int port)
3131
{
3232
return false;
3333
}
3434

35-
public virtual Task StartHostLobbyAsync(string playerId, string playerName)
35+
public virtual Task StartHostLobbyAsync(string playerName)
3636
{
3737
return Task.CompletedTask;
3838
}

Assets/Scripts/Gameplay/ConnectionManagement/ConnectionState/OfflineConnectionState.cs

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,59 @@
11
using System;
22
using System.Threading.Tasks;
3+
using Unity.Multiplayer.Samples.BossRoom.Client;
4+
using Unity.Multiplayer.Samples.BossRoom.Shared;
35
using Unity.Multiplayer.Samples.BossRoom.Shared.Net.UnityServices.Lobbies;
46
using Unity.Multiplayer.Samples.Utilities;
57
using Unity.Netcode;
68
using Unity.Netcode.Transports.UTP;
9+
using Unity.Services.Authentication;
10+
using Unity.Services.Core;
711
using UnityEngine;
812
using UnityEngine.SceneManagement;
913

1014
namespace Unity.Multiplayer.Samples.BossRoom
1115
{
1216
public class OfflineConnectionState : ConnectionState
1317
{
14-
LobbyServiceFacade m_LobbyServiceFacade;
15-
LocalLobby m_LocalLobby;
18+
protected LobbyServiceFacade m_LobbyServiceFacade;
19+
protected LocalLobby m_LocalLobby;
20+
ProfileManager m_ProfileManager;
1621

1722
/// <summary>
1823
/// How many connections we create a Unity relay allocation for
1924
/// </summary>
2025
private const int k_MaxUnityRelayConnections = 8;
2126

22-
public OfflineConnectionState(ConnectionManager connectionManager, LobbyServiceFacade lobbyServiceFacade, LocalLobby localLobby)
27+
public OfflineConnectionState(ConnectionManager connectionManager, LobbyServiceFacade lobbyServiceFacade,
28+
LocalLobby localLobby, ProfileManager profileManager)
2329
: base(connectionManager)
2430
{
2531
m_LobbyServiceFacade = lobbyServiceFacade;
2632
m_LocalLobby = localLobby;
33+
m_ProfileManager = profileManager;
2734
}
2835

2936
public override void Enter() { }
3037

3138
public override void Exit() { }
3239

33-
public override void StartClientIP(string playerId, string playerName, string ipaddress, int port)
40+
public override void StartClientIP(string playerName, string ipaddress, int port)
3441
{
3542
var utp = (UnityTransport)m_ConnectionManager.NetworkManager.NetworkConfig.NetworkTransport;
3643
utp.SetConnectionData(ipaddress, (ushort)port);
37-
ConnectClient(playerId, playerName);
44+
ConnectClient(GetPlayerId(), playerName);
3845
m_ConnectionManager.ChangeState(ConnectionStateType.Connecting);
3946
}
4047

41-
public override async Task StartClientLobbyAsync(string playerName, string playerId, Action<string> onFailure)
48+
public override async Task StartClientLobbyAsync(string playerName, Action<string> onFailure)
49+
{
50+
if (await JoinRelayServerAsync(onFailure)) return;//not re-throwing, but still not allowing to connect
51+
52+
ConnectClient(GetPlayerId(), playerName);
53+
m_ConnectionManager.ChangeState(ConnectionStateType.Connecting);
54+
}
55+
56+
protected async Task<bool> JoinRelayServerAsync(Action<string> onFailure)
4257
{
4358
Debug.Log($"Setting Unity Relay client with join code {m_LocalLobby.RelayJoinCode}");
4459

@@ -48,25 +63,24 @@ public override async Task StartClientLobbyAsync(string playerName, string playe
4863
await UnityRelayUtilities.JoinRelayServerFromJoinCode(m_LocalLobby.RelayJoinCode);
4964

5065
await m_LobbyServiceFacade.UpdatePlayerRelayInfoAsync(allocationIdBytes.ToString(), m_LocalLobby.RelayJoinCode);
51-
var utp = (UnityTransport)m_ConnectionManager.NetworkManager.NetworkConfig.NetworkTransport;
66+
var utp = (UnityTransport) m_ConnectionManager.NetworkManager.NetworkConfig.NetworkTransport;
5267
utp.SetClientRelayData(ipv4Address, port, allocationIdBytes, key, connectionData, hostConnectionData, isSecure: true);
5368
}
5469
catch (Exception e)
5570
{
5671
onFailure?.Invoke(e.Message);
57-
return;//not re-throwing, but still not allowing to connect
72+
return true;
5873
}
5974

60-
ConnectClient(playerId, playerName);
61-
m_ConnectionManager.ChangeState(ConnectionStateType.Connecting);
75+
return false;
6276
}
6377

64-
public override bool StartHostIP(string playerId, string playerName, string ipaddress, int port)
78+
public override bool StartHostIP(string playerName, string ipaddress, int port)
6579
{
6680
var utp = (UnityTransport)NetworkManager.Singleton.NetworkConfig.NetworkTransport;
6781
utp.SetConnectionData(ipaddress, (ushort)port);
6882

69-
var success = StartHost(playerId, playerName);
83+
var success = StartHost(GetPlayerId(), playerName);
7084
if (success)
7185
{
7286
m_ConnectionManager.ChangeState(ConnectionStateType.Hosting);
@@ -75,7 +89,7 @@ public override bool StartHostIP(string playerId, string playerName, string ipad
7589
return success;
7690
}
7791

78-
public override async Task StartHostLobbyAsync(string playerId, string playerName)
92+
public override async Task StartHostLobbyAsync(string playerName)
7993
{
8094
Debug.Log("Setting up Unity Relay host");
8195

@@ -99,7 +113,7 @@ public override async Task StartHostLobbyAsync(string playerId, string playerNam
99113
throw;
100114
}
101115

102-
if (StartHost(playerId, playerName))
116+
if (StartHost(GetPlayerId(), playerName))
103117
{
104118
m_ConnectionManager.ChangeState(ConnectionStateType.Hosting);
105119
}
@@ -149,5 +163,15 @@ bool StartHost(string playerId, string playerName)
149163
SetConnectionPayload(playerId, playerName);
150164
return m_ConnectionManager.NetworkManager.StartHost();
151165
}
166+
167+
string GetPlayerId()
168+
{
169+
if (UnityServices.State != ServicesInitializationState.Initialized)
170+
{
171+
return ClientPrefs.GetGuid() + m_ProfileManager.Profile;
172+
}
173+
174+
return AuthenticationService.Instance.IsSignedIn ? AuthenticationService.Instance.PlayerId : ClientPrefs.GetGuid() + m_ProfileManager.Profile;
175+
}
152176
}
153177
}

Assets/Scripts/Gameplay/ConnectionManagement/ConnectionState/ReconnectingConnectionState.cs

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections;
33
using System.Threading.Tasks;
44
using Unity.Multiplayer.Samples.BossRoom.ApplicationLifecycle.Messages;
5+
using Unity.Multiplayer.Samples.BossRoom.Shared;
56
using Unity.Multiplayer.Samples.BossRoom.Shared.Infrastructure;
67
using Unity.Multiplayer.Samples.BossRoom.Shared.Net.UnityServices.Lobbies;
78
using Unity.Multiplayer.Samples.Utilities;
@@ -11,24 +12,20 @@
1112

1213
namespace Unity.Multiplayer.Samples.BossRoom
1314
{
14-
public class ReconnectingConnectionState : ConnectionState
15+
public class ReconnectingConnectionState : OfflineConnectionState
1516
{
1617
const int k_NbReconnectAttempts = 2;
1718

18-
LobbyServiceFacade m_LobbyServiceFacade;
19-
LocalLobby m_LocalLobby;
2019
IPublisher<ReconnectMessage> m_ReconnectMessagePublisher;
2120

2221
Coroutine m_ReconnectCoroutine;
2322
string m_LobbyCode = "";
2423
int m_NbAttempts;
2524

2625
public ReconnectingConnectionState(ConnectionManager connectionManager, LobbyServiceFacade lobbyServiceFacade,
27-
LocalLobby localLobby, IPublisher<ReconnectMessage> reconnectMessagePublisher)
28-
: base(connectionManager)
26+
LocalLobby localLobby, IPublisher<ReconnectMessage> reconnectMessagePublisher, ProfileManager profileManager)
27+
: base(connectionManager, lobbyServiceFacade, localLobby, profileManager)
2928
{
30-
m_LobbyServiceFacade = lobbyServiceFacade;
31-
m_LocalLobby = localLobby;
3229
m_ReconnectMessagePublisher = reconnectMessagePublisher;
3330
}
3431

@@ -81,6 +78,23 @@ public override void OnUserRequestedShutdown()
8178
m_ConnectionManager.ChangeState(ConnectionStateType.Offline);
8279
}
8380

81+
public override void StartClientIP(string playerName, string ipaddress, int port) {}
82+
83+
public override Task StartClientLobbyAsync(string playerName, Action<string> onFailure)
84+
{
85+
return Task.CompletedTask;
86+
}
87+
88+
public override bool StartHostIP(string playerName, string ipaddress, int port)
89+
{
90+
return false;
91+
}
92+
93+
public override Task StartHostLobbyAsync(string playerName)
94+
{
95+
return Task.CompletedTask;
96+
}
97+
8498
IEnumerator ReconnectCoroutine()
8599
{
86100
Debug.Log("Lost connection to host, trying to reconnect...");
@@ -90,6 +104,7 @@ IEnumerator ReconnectCoroutine()
90104
yield return new WaitWhile(() => NetworkManager.Singleton.ShutdownInProgress); // wait until NetworkManager completes shutting down
91105
Debug.Log($"Reconnecting attempt {m_NbAttempts + 1}/{k_NbReconnectAttempts}...");
92106
m_ReconnectMessagePublisher.Publish(new ReconnectMessage(m_NbAttempts, k_NbReconnectAttempts));
107+
m_NbAttempts++;
93108
if (!string.IsNullOrEmpty(m_LobbyCode))
94109
{
95110
var leavingLobby = m_LobbyServiceFacade.EndTracking();
@@ -99,39 +114,28 @@ IEnumerator ReconnectCoroutine()
99114
if (joiningLobby.Result.Success)
100115
{
101116
m_LobbyServiceFacade.SetRemoteLobby(joiningLobby.Result.Lobby);
102-
var joiningRelay = JoinRelayServerAsync();
117+
var joiningRelay = JoinRelayServerAsync(null);
103118
yield return new WaitUntil(() => joiningRelay.IsCompleted);
119+
if (joiningRelay.Result)
120+
{
121+
ConnectClient();
122+
}
123+
else
124+
{
125+
Debug.Log("Failed joining Relay server.");
126+
OnClientDisconnect(0);
127+
}
104128
}
105129
else
106130
{
107131
Debug.Log("Failed joining lobby.");
132+
OnClientDisconnect(0);
108133
}
109134
}
110135
else
111136
{
112137
ConnectClient();
113138
}
114-
115-
m_NbAttempts++;
116-
}
117-
118-
async Task JoinRelayServerAsync()
119-
{
120-
try
121-
{
122-
var (ipv4Address, port, allocationIdBytes, connectionData, hostConnectionData, key) =
123-
await UnityRelayUtilities.JoinRelayServerFromJoinCode(m_LocalLobby.RelayJoinCode);
124-
125-
await m_LobbyServiceFacade.UpdatePlayerRelayInfoAsync(allocationIdBytes.ToString(), m_LocalLobby.RelayJoinCode);
126-
var utp = (UnityTransport)m_ConnectionManager.NetworkManager.NetworkConfig.NetworkTransport;
127-
utp.SetClientRelayData(ipv4Address, port, allocationIdBytes, key, connectionData, hostConnectionData, isSecure: true);
128-
}
129-
catch (Exception)
130-
{
131-
return;//not re-throwing, but still not allowing to connect
132-
}
133-
134-
ConnectClient();
135139
}
136140

137141
void ConnectClient()

0 commit comments

Comments
 (0)