Skip to content

Commit 52ae6a6

Browse files
feat: adding NetworkSimulator [MTT-6084] [MTT-6083] (#843)
* Upgraded UTP to version 2.0.2 * Adding NetworkSimulator --------- Co-authored-by: jilfranco-unity <jillian.franco@unity3d.com>
1 parent 123f2c8 commit 52ae6a6

14 files changed

+5680
-24
lines changed

Assets/Prefabs/UI/NetworkSimulator.prefab

Lines changed: 5326 additions & 0 deletions
Large diffs are not rendered by default.

Assets/Prefabs/UI/NetworkSimulator.prefab.meta

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Scenes/Startup.unity

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
version https://git-lfs.github.com/spec/v1
2-
oid sha256:89766f5be9a377c6e6749849490ece163d1a4a1ee0d5600e9fe04415e0e83381
3-
size 48341
2+
oid sha256:23e64f176df19566b90ab728417990e715e937d86d6499e1b1d537c39e9fe63a
3+
size 52979

Assets/Scripts/Gameplay/UI/IPUIMediator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ public static string SanitizePort(string dirtyString)
197197
public static bool AreIpAddressAndPortValid(string ipAddress, string port)
198198
{
199199
var portValid = ushort.TryParse(port, out var portNum);
200-
return portValid && NetworkEndPoint.TryParse(ipAddress, portNum, out var networkEndPoint);
200+
return portValid && NetworkEndpoint.TryParse(ipAddress, portNum, out var networkEndPoint);
201201
}
202202
}
203203
}

Assets/Scripts/Gameplay/Unity.BossRoom.Gameplay.asmdef

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
"Unity.BossRoom.ConnectionManagement",
2222
"VContainer",
2323
"Unity.BossRoom.VisualEffects",
24-
"Unity.BossRoom.CameraUtils"
24+
"Unity.BossRoom.CameraUtils",
25+
"Unity.Multiplayer.Tools.NetworkSimulator.Runtime"
2526
],
2627
"includePlatforms": [],
2728
"excludePlatforms": [],

Assets/Scripts/Utils/NetworkOverlay/NetworkLatencyWarning.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using TMPro;
3+
using Unity.Multiplayer.Tools.NetworkSimulator.Runtime;
34
using UnityEngine;
45
using Unity.Netcode;
56
using Unity.Netcode.Transports.UTP;
@@ -10,6 +11,9 @@ namespace Unity.BossRoom.Utils.Editor
1011
{
1112
public class NetworkLatencyWarning : MonoBehaviour
1213
{
14+
[SerializeField]
15+
NetworkSimulator m_NetworkSimulator;
16+
1317
TextMeshProUGUI m_LatencyText;
1418
bool m_LatencyTextCreated;
1519

@@ -25,10 +29,11 @@ void Update()
2529

2630
// adding this preprocessor directive check since UnityTransport's simulator tools only inject latency in #UNITY_EDITOR or in #DEVELOPMENT_BUILD
2731
#if UNITY_EDITOR || DEVELOPMENT_BUILD
28-
var simulatorParameters = unityTransport.DebugSimulator;
29-
m_ArtificialLatencyEnabled = simulatorParameters.PacketDelayMS > 0 ||
30-
simulatorParameters.PacketJitterMS > 0 ||
31-
simulatorParameters.PacketDropRate > 0;
32+
var currentSimulationPreset = m_NetworkSimulator.CurrentPreset;
33+
m_ArtificialLatencyEnabled = currentSimulationPreset.PacketDelayMs > 0 ||
34+
currentSimulationPreset.PacketJitterMs > 0 ||
35+
currentSimulationPreset.PacketLossInterval > 0 ||
36+
currentSimulationPreset.PacketLossPercent > 0;
3237
#else
3338
m_ArtificialLatencyEnabled = false;
3439
#endif
Lines changed: 287 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,287 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text.RegularExpressions;
4+
using TMPro;
5+
using Unity.Multiplayer.Tools.NetworkSimulator.Runtime;
6+
using Unity.Multiplayer.Tools.NetworkSimulator.Runtime.BuiltInScenarios;
7+
using Unity.Netcode;
8+
using UnityEngine;
9+
using UnityEngine.UI;
10+
11+
namespace Unity.BossRoom.Utils
12+
{
13+
public class NetworkSimulatorUIMediator : MonoBehaviour
14+
{
15+
#if UNITY_EDITOR || DEVELOPMENT_BUILD
16+
[SerializeField]
17+
NetworkSimulator m_NetworkSimulator;
18+
#endif
19+
[SerializeField]
20+
CanvasGroup m_CanvasGroup;
21+
22+
#if UNITY_EDITOR || DEVELOPMENT_BUILD
23+
[SerializeField]
24+
TMP_Dropdown m_PresetsDropdown;
25+
26+
[SerializeField]
27+
TMP_Dropdown m_ScenariosDropdown;
28+
29+
[SerializeField]
30+
Button m_ScenariosButton;
31+
32+
[SerializeField]
33+
TextMeshProUGUI m_ScenariosButtonText;
34+
35+
[SerializeField]
36+
TMP_InputField m_LagSpikeDuration;
37+
38+
[SerializeField]
39+
KeyCode m_OpenWindowKeyCode = KeyCode.Tilde;
40+
41+
[SerializeField]
42+
List<ConnectionsCycle.Configuration> m_ConnectionsCycleConfigurations;
43+
44+
[SerializeField]
45+
List<RandomConnectionsSwap.Configuration> m_RandomConnectionsSwapConfigurations;
46+
47+
[SerializeField]
48+
int m_RandomConnectionsSwapChangeIntervalMilliseconds;
49+
50+
const int k_NbTouchesToOpenWindow = 5;
51+
52+
Dictionary<string, INetworkSimulatorPreset> m_SimulatorPresets = new Dictionary<string, INetworkSimulatorPreset>();
53+
#endif
54+
bool m_Shown;
55+
56+
const string k_None = "None";
57+
const string k_ConnectionCyclesScenarioName = "Connections Cycle";
58+
const string k_RandomConnectionSwapScenarioName = "Random Connections Swap";
59+
const string k_PauseString = "Pause";
60+
const string k_ResumeString = "Resume";
61+
62+
void Awake()
63+
{
64+
#if UNITY_EDITOR || DEVELOPMENT_BUILD
65+
InitializeUI();
66+
#endif
67+
// Hide UI until ready
68+
Hide();
69+
}
70+
71+
public void Hide()
72+
{
73+
m_CanvasGroup.alpha = 0f;
74+
m_CanvasGroup.interactable = false;
75+
m_CanvasGroup.blocksRaycasts = false;
76+
m_Shown = false;
77+
}
78+
79+
#if UNITY_EDITOR || DEVELOPMENT_BUILD
80+
void Start()
81+
{
82+
NetworkManager.Singleton.OnClientStarted += OnNetworkManagerStarted;
83+
NetworkManager.Singleton.OnServerStarted += OnNetworkManagerStarted;
84+
}
85+
86+
void OnDestroy()
87+
{
88+
if (NetworkManager.Singleton is not null)
89+
{
90+
NetworkManager.Singleton.OnClientStarted -= OnNetworkManagerStarted;
91+
NetworkManager.Singleton.OnServerStarted -= OnNetworkManagerStarted;
92+
}
93+
}
94+
95+
void OnNetworkManagerStarted()
96+
{
97+
if (m_NetworkSimulator.IsAvailable)
98+
{
99+
Show();
100+
}
101+
}
102+
103+
void OnPresetChanged(int optionIndex)
104+
{
105+
m_NetworkSimulator.ChangeConnectionPreset(m_SimulatorPresets[m_PresetsDropdown.options[optionIndex].text]);
106+
}
107+
108+
void OnScenarioChanged(int optionIndex)
109+
{
110+
var scenarioName = m_ScenariosDropdown.options[optionIndex].text;
111+
NetworkScenario scenario = null;
112+
switch (scenarioName)
113+
{
114+
case k_None:
115+
m_PresetsDropdown.captionText.color = m_PresetsDropdown.colors.normalColor;
116+
m_PresetsDropdown.interactable = true;
117+
break;
118+
case k_ConnectionCyclesScenarioName:
119+
var connectionsCyleScenario = new ConnectionsCycle();
120+
connectionsCyleScenario.Configurations.Clear();
121+
foreach (var configuration in m_ConnectionsCycleConfigurations)
122+
{
123+
connectionsCyleScenario.Configurations.Add(configuration);
124+
}
125+
m_PresetsDropdown.captionText.color = m_PresetsDropdown.colors.disabledColor;
126+
m_PresetsDropdown.interactable = false;
127+
scenario = connectionsCyleScenario;
128+
break;
129+
case k_RandomConnectionSwapScenarioName:
130+
var randomConnectionsSwapScenario = new RandomConnectionsSwap();
131+
randomConnectionsSwapScenario.Configurations.Clear();
132+
foreach (var configuration in m_RandomConnectionsSwapConfigurations)
133+
{
134+
randomConnectionsSwapScenario.Configurations.Add(configuration);
135+
}
136+
m_PresetsDropdown.captionText.color = m_PresetsDropdown.colors.disabledColor;
137+
m_PresetsDropdown.interactable = false;
138+
scenario = randomConnectionsSwapScenario;
139+
break;
140+
default:
141+
Debug.LogError("Invalid Scenario selected.");
142+
m_PresetsDropdown.captionText.color = m_PresetsDropdown.colors.normalColor;
143+
m_PresetsDropdown.interactable = true;
144+
break;
145+
}
146+
m_NetworkSimulator.Scenario = scenario;
147+
m_NetworkSimulator.Scenario?.Start(m_NetworkSimulator);
148+
UpdateScenarioButton();
149+
}
150+
151+
void Show()
152+
{
153+
m_CanvasGroup.alpha = 1f;
154+
m_CanvasGroup.interactable = true;
155+
m_CanvasGroup.blocksRaycasts = true;
156+
UpdateScenarioButton();
157+
m_Shown = true;
158+
}
159+
160+
void ToggleVisibility()
161+
{
162+
if (m_Shown)
163+
{
164+
Hide();
165+
}
166+
else
167+
{
168+
Show();
169+
}
170+
}
171+
172+
void InitializeUI()
173+
{
174+
// Initialize connection presets dropdown
175+
var optionData = new List<TMP_Dropdown.OptionData>();
176+
// Adding all available presets
177+
foreach (var networkSimulatorPreset in NetworkSimulatorPresets.Values)
178+
{
179+
m_SimulatorPresets[networkSimulatorPreset.Name] = networkSimulatorPreset;
180+
optionData.Add(new TMP_Dropdown.OptionData(networkSimulatorPreset.Name));
181+
}
182+
m_PresetsDropdown.AddOptions(optionData);
183+
m_PresetsDropdown.onValueChanged.AddListener(OnPresetChanged);
184+
185+
// Initialize scenario dropdown
186+
optionData = new List<TMP_Dropdown.OptionData>();
187+
188+
// Adding empty scenario
189+
optionData.Add(new TMP_Dropdown.OptionData(k_None));
190+
191+
// Adding ConnectionsCycle scenario
192+
optionData.Add(new TMP_Dropdown.OptionData(k_ConnectionCyclesScenarioName));
193+
194+
// Adding RandomConnectionsSwap scenario
195+
optionData.Add(new TMP_Dropdown.OptionData(k_RandomConnectionSwapScenarioName));
196+
197+
m_ScenariosDropdown.AddOptions(optionData);
198+
m_ScenariosDropdown.onValueChanged.AddListener(OnScenarioChanged);
199+
}
200+
201+
void Update()
202+
{
203+
if (m_NetworkSimulator.IsAvailable)
204+
{
205+
if (Input.touchCount == k_NbTouchesToOpenWindow && AnyTouchDown() ||
206+
m_OpenWindowKeyCode != KeyCode.None && Input.GetKeyDown(m_OpenWindowKeyCode))
207+
{
208+
ToggleVisibility();
209+
}
210+
211+
var selectedPreset = m_PresetsDropdown.options[m_PresetsDropdown.value].text;
212+
if (selectedPreset != m_NetworkSimulator.CurrentPreset.Name)
213+
{
214+
for (var i = 0; i < m_PresetsDropdown.options.Count; i++)
215+
{
216+
if (m_PresetsDropdown.options[i].text == m_NetworkSimulator.CurrentPreset.Name)
217+
{
218+
m_PresetsDropdown.value = i;
219+
}
220+
}
221+
}
222+
223+
}
224+
else
225+
{
226+
if (m_Shown)
227+
{
228+
Hide();
229+
}
230+
}
231+
}
232+
233+
static bool AnyTouchDown()
234+
{
235+
foreach (var touch in Input.touches)
236+
{
237+
if (touch.phase == TouchPhase.Began)
238+
{
239+
return true;
240+
}
241+
}
242+
return false;
243+
}
244+
245+
public void SimulateDisconnect()
246+
{
247+
m_NetworkSimulator.Disconnect();
248+
}
249+
250+
public void TriggerLagSpike()
251+
{
252+
double.TryParse(m_LagSpikeDuration.text, out var duration);
253+
m_NetworkSimulator.TriggerLagSpike(TimeSpan.FromMilliseconds(duration));
254+
}
255+
256+
public void SanitizeLagSpikeDurationInputField()
257+
{
258+
m_LagSpikeDuration.text = Regex.Replace(m_LagSpikeDuration.text, "[^0-9]", "");
259+
}
260+
261+
public void TriggerScenario()
262+
{
263+
if (m_NetworkSimulator.Scenario != null)
264+
{
265+
m_NetworkSimulator.Scenario.IsPaused = !m_NetworkSimulator.Scenario.IsPaused;
266+
UpdateScenarioButton();
267+
}
268+
}
269+
270+
void UpdateScenarioButton()
271+
{
272+
if (m_NetworkSimulator.Scenario != null)
273+
{
274+
m_ScenariosButtonText.text = m_NetworkSimulator.Scenario.IsPaused ? k_ResumeString : k_PauseString;
275+
m_ScenariosButton.interactable = true;
276+
m_ScenariosButtonText.color = m_ScenariosButton.colors.normalColor;
277+
}
278+
else
279+
{
280+
m_ScenariosButtonText.text = "None";
281+
m_ScenariosButton.interactable = false;
282+
m_ScenariosButtonText.color = m_ScenariosButton.colors.disabledColor;
283+
}
284+
}
285+
#endif
286+
}
287+
}

Assets/Scripts/Utils/NetworkSimulatorUIMediator.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Scripts/Utils/Unity.BossRoom.Utils.asmdef

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"references": [
55
"Unity.TextMeshPro",
66
"Unity.Netcode.Runtime",
7+
"Unity.Multiplayer.Tools.NetworkSimulator.Runtime",
78
"Unity.Networking.Transport",
89
"Unity.Collections"
910
],

0 commit comments

Comments
 (0)