Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
fbef7c9
refactor: simplify tick system, introduce server based time
LukeStampfli Apr 22, 2021
dbb4dc2
feat: remove receive tick
LukeStampfli Apr 22, 2021
64296bd
feat: remove max received events per tick rate
LukeStampfli Apr 22, 2021
c90994f
WIP
LukeStampfli Apr 28, 2021
432171a
feat!: Update components to use new time system. Remove time sync mes…
LukeStampfli Apr 29, 2021
10c7842
feat: Add network time serializer
LukeStampfli Apr 29, 2021
1120814
fix: NetworkTime initial sync
LukeStampfli Apr 30, 2021
e6cedfb
fix: NetworkTimeSerializer
LukeStampfli Apr 30, 2021
11769a7
feat: NetworkTime operators
LukeStampfli Apr 30, 2021
e6b8f19
feat: time system and dynamic time provider
LukeStampfli May 4, 2021
9a3867e
feat: Add buffer config
LukeStampfli May 4, 2021
1b43bf7
refactor: move time related code into time system
LukeStampfli May 4, 2021
d545e21
refactor: renaming and reorganize
LukeStampfli May 7, 2021
c6d2a3a
feat: remove network time serializer
LukeStampfli May 7, 2021
aa25482
Merge branch 'develop' into experimental/network-time
LukeStampfli May 7, 2021
73de76e
feat: improved networktime advance precision
LukeStampfli May 8, 2021
2ce9852
feat: remove extra precision in networktime advance
LukeStampfli May 8, 2021
315b961
test: NetworkTime operator and create tests
LukeStampfli May 8, 2021
b6a3ffd
fix: NetworkManager hook up network time
LukeStampfli May 8, 2021
36e5e61
test: serverNetworkTimeProvider tests
LukeStampfli May 9, 2021
827f590
feat: network time add ToFixedTime function
LukeStampfli May 10, 2021
59ec8a3
feat: Add INetworkStats interface
LukeStampfli May 10, 2021
f0605a3
fix: network time test intervals
LukeStampfli May 10, 2021
251eef6
tests: ClientNetworkTimeProvider tests
LukeStampfli May 10, 2021
a61e788
fix: ClientNetworkTimeProvider target time calculations
LukeStampfli May 11, 2021
5d5c288
refactor: switch return bool in AdvanceTime
LukeStampfli May 11, 2021
7ba6537
docs: comments
LukeStampfli May 11, 2021
011f34c
tests: step infrastructure
LukeStampfli May 11, 2021
853ef3c
fix: minor fixes
LukeStampfli May 14, 2021
cd176a0
chore: add root namespace to test asmdef
LukeStampfli May 19, 2021
4c23586
tests: Add network time system player loop test
LukeStampfli May 19, 2021
2ff0d00
tests: remove legacy tick system test
LukeStampfli May 19, 2021
97ccf72
refactor: move comment
LukeStampfli May 19, 2021
87964ba
test: Upgrade manual network variable test to new time system
LukeStampfli May 19, 2021
151e224
docs: Update code comments
LukeStampfli May 19, 2021
b7c1bd7
refactor: NetworkTimeSystem property to uppercase
LukeStampfli May 19, 2021
94b3c8a
feat: Remove correction tollerance
LukeStampfli May 19, 2021
9439281
refactor: cleanup internal message handler
LukeStampfli May 19, 2021
448e974
docs: INetworkTimeProvider docs
LukeStampfli May 19, 2021
a40db6c
docs: Improved docs for tests
LukeStampfli May 19, 2021
f1d71b3
feat: INetworkStats to properties and docs
LukeStampfli May 19, 2021
85df5a1
refactor: network time system events and docs
LukeStampfli May 19, 2021
0454b5a
test: update tests
LukeStampfli May 19, 2021
9442538
feat: remove buffering from config
LukeStampfli May 19, 2021
8a76115
docs: network time docs
LukeStampfli May 19, 2021
9cb765e
docs: network config tooltip for tickrate
LukeStampfli May 19, 2021
58cc9cd
feat: completely remove old network time
LukeStampfli May 19, 2021
e98c012
docs: networktime
LukeStampfli May 19, 2021
01f52fa
feat: client time provider make properties public and docs
LukeStampfli May 19, 2021
de9f4ff
Merge branch 'develop' into feature/network-time
LukeStampfli May 19, 2021
5547e4b
typo atleast->at least
mattwalsh-unity May 22, 2021
dffbe7f
feat: decouple network time system and make disposable
LukeStampfli May 24, 2021
89f5471
Merge branch 'feature/network-time' of https://github.com/Unity-Techn…
LukeStampfli May 24, 2021
ebb0821
feat: NetworkTime use double everywhere
LukeStampfli Jun 14, 2021
0e21b77
Merge remote-tracking branch 'origin/develop' into feature/network-time
LukeStampfli Jun 14, 2021
b9667a8
fix: fix NetworkManagerHelper teardown
LukeStampfli Jun 14, 2021
c660e1e
feat: rename predicted time to local time
LukeStampfli Jun 14, 2021
61428a0
feat: Handle negative time correctly.
LukeStampfli Jun 14, 2021
cdcd56d
docs: Improve tick rate tool tip.
LukeStampfli Jun 14, 2021
d154779
refactor: fix formatting
LukeStampfli Jun 14, 2021
563945a
Merge branch 'develop' into feature/network-time
mattwalsh-unity Jun 19, 2021
f6ab35b
Merge branch 'develop' into feature/network-time
LukeStampfli Jun 29, 2021
b067350
update time system to new design from RFC
LukeStampfli Jul 12, 2021
08d13f0
Merge branch 'develop' into feature/network-time
LukeStampfli Jul 12, 2021
de4559d
remove legacy network time offset
LukeStampfli Jul 12, 2021
d329675
revert networkmanager formatting
LukeStampfli Jul 12, 2021
5e60377
initialize time system correctly
LukeStampfli Jul 12, 2021
f674100
fix initialization
LukeStampfli Jul 12, 2021
cdc3024
Merge branch 'develop' into feature/network-time
LukeStampfli Jul 14, 2021
beb8f50
refactor: add sec suffix to internal time values
LukeStampfli Jul 15, 2021
aab1a27
docs: Better explanation for TODO workaround
LukeStampfli Jul 15, 2021
48c5c5e
refactor: rename initialize to reset in time system
LukeStampfli Jul 15, 2021
865bb3d
docs: Add missing XML docs to NetworkTimeSystem
LukeStampfli Jul 15, 2021
7d5215f
docs: Add todo to decouple time system from NetworkManager
LukeStampfli Jul 15, 2021
9745475
Merge branch 'feature/network-time' of https://github.com/Unity-Techn…
LukeStampfli Jul 15, 2021
cabdfd8
Merge branch 'develop' into feature/network-time
LukeStampfli Jul 15, 2021
09222f6
change tickrate to 30
LukeStampfli Jul 20, 2021
1e55ca0
add time sync message back and mutli instance test
LukeStampfli Jul 20, 2021
fbe1825
dotnet format
LukeStampfli Jul 20, 2021
8391703
Merge branch 'develop' into feature/network-time
LukeStampfli Jul 20, 2021
fbe7c91
fix tests
LukeStampfli Jul 20, 2021
dfa2222
fix network constants
LukeStampfli Jul 20, 2021
8cc5208
fix test tolerance
LukeStampfli Jul 20, 2021
d396024
consistent use of double and adjust constants notation
LukeStampfli Jul 20, 2021
426c23d
remove unecessary code.
LukeStampfli Jul 21, 2021
bb80275
Add additinal time tolerance to multi instance tests
LukeStampfli Jul 21, 2021
7c5ed54
Use non tickrate related time sync frequency
LukeStampfli Jul 21, 2021
e525050
fix frequency calculation
LukeStampfli Jul 21, 2021
297aa39
explicitly name magic number in test
LukeStampfli Jul 21, 2021
bd82cff
Merge branch 'develop' into feature/network-time
LukeStampfli Jul 21, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 4 additions & 33 deletions com.unity.multiplayer.mlapi/Editor/NetworkManagerEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,10 @@ public class NetworkManagerEditor : UnityEditor.Editor
private SerializedProperty m_ProtocolVersionProperty;
private SerializedProperty m_AllowRuntimeSceneChangesProperty;
private SerializedProperty m_NetworkTransportProperty;
private SerializedProperty m_ReceiveTickrateProperty;
private SerializedProperty m_NetworkTickIntervalSecProperty;
private SerializedProperty m_MaxReceiveEventsPerTickRateProperty;
private SerializedProperty m_EventTickrateProperty;
private SerializedProperty m_TickRateProperty;
private SerializedProperty m_MaxObjectUpdatesPerTickProperty;
private SerializedProperty m_ClientConnectionBufferTimeoutProperty;
private SerializedProperty m_ConnectionApprovalProperty;
private SerializedProperty m_EnableTimeResyncProperty;
private SerializedProperty m_TimeResyncIntervalProperty;
private SerializedProperty m_EnableNetworkVariableProperty;
private SerializedProperty m_EnsureNetworkVariableLengthSafetyProperty;
private SerializedProperty m_ForceSamePrefabsProperty;
Expand Down Expand Up @@ -103,14 +98,9 @@ private void Initialize()
m_ProtocolVersionProperty = m_NetworkConfigProperty.FindPropertyRelative("ProtocolVersion");
m_AllowRuntimeSceneChangesProperty = m_NetworkConfigProperty.FindPropertyRelative("AllowRuntimeSceneChanges");
m_NetworkTransportProperty = m_NetworkConfigProperty.FindPropertyRelative("NetworkTransport");
m_ReceiveTickrateProperty = m_NetworkConfigProperty.FindPropertyRelative("ReceiveTickrate");
m_NetworkTickIntervalSecProperty = m_NetworkConfigProperty.FindPropertyRelative("NetworkTickIntervalSec");
m_MaxReceiveEventsPerTickRateProperty = m_NetworkConfigProperty.FindPropertyRelative("MaxReceiveEventsPerTickRate");
m_EventTickrateProperty = m_NetworkConfigProperty.FindPropertyRelative("EventTickrate");
m_TickRateProperty = m_NetworkConfigProperty.FindPropertyRelative("TickRate");
m_ClientConnectionBufferTimeoutProperty = m_NetworkConfigProperty.FindPropertyRelative("ClientConnectionBufferTimeout");
m_ConnectionApprovalProperty = m_NetworkConfigProperty.FindPropertyRelative("ConnectionApproval");
m_EnableTimeResyncProperty = m_NetworkConfigProperty.FindPropertyRelative("EnableTimeResync");
m_TimeResyncIntervalProperty = m_NetworkConfigProperty.FindPropertyRelative("TimeResyncInterval");
m_EnableNetworkVariableProperty = m_NetworkConfigProperty.FindPropertyRelative("EnableNetworkVariable");
m_EnsureNetworkVariableLengthSafetyProperty = m_NetworkConfigProperty.FindPropertyRelative("EnsureNetworkVariableLengthSafety");
m_ForceSamePrefabsProperty = m_NetworkConfigProperty.FindPropertyRelative("ForceSamePrefabs");
Expand Down Expand Up @@ -139,14 +129,9 @@ private void CheckNullProperties()
m_ProtocolVersionProperty = m_NetworkConfigProperty.FindPropertyRelative("ProtocolVersion");
m_AllowRuntimeSceneChangesProperty = m_NetworkConfigProperty.FindPropertyRelative("AllowRuntimeSceneChanges");
m_NetworkTransportProperty = m_NetworkConfigProperty.FindPropertyRelative("NetworkTransport");
m_ReceiveTickrateProperty = m_NetworkConfigProperty.FindPropertyRelative("ReceiveTickrate");
m_NetworkTickIntervalSecProperty = m_NetworkConfigProperty.FindPropertyRelative("NetworkTickIntervalSec");
m_MaxReceiveEventsPerTickRateProperty = m_NetworkConfigProperty.FindPropertyRelative("MaxReceiveEventsPerTickRate");
m_EventTickrateProperty = m_NetworkConfigProperty.FindPropertyRelative("EventTickrate");
m_TickRateProperty = m_NetworkConfigProperty.FindPropertyRelative("TickRate");
m_ClientConnectionBufferTimeoutProperty = m_NetworkConfigProperty.FindPropertyRelative("ClientConnectionBufferTimeout");
m_ConnectionApprovalProperty = m_NetworkConfigProperty.FindPropertyRelative("ConnectionApproval");
m_EnableTimeResyncProperty = m_NetworkConfigProperty.FindPropertyRelative("EnableTimeResync");
m_TimeResyncIntervalProperty = m_NetworkConfigProperty.FindPropertyRelative("TimeResyncInterval");
m_EnableNetworkVariableProperty = m_NetworkConfigProperty.FindPropertyRelative("EnableNetworkVariable");
m_EnsureNetworkVariableLengthSafetyProperty = m_NetworkConfigProperty.FindPropertyRelative("EnsureNetworkVariableLengthSafety");
m_ForceSamePrefabsProperty = m_NetworkConfigProperty.FindPropertyRelative("ForceSamePrefabs");
Expand Down Expand Up @@ -304,27 +289,13 @@ public override void OnInspectorGUI()
}
}

EditorGUILayout.PropertyField(m_EnableTimeResyncProperty);

using (new EditorGUI.DisabledScope(!m_NetworkManager.NetworkConfig.EnableTimeResync))
{
EditorGUILayout.PropertyField(m_TimeResyncIntervalProperty);
}
EditorGUILayout.PropertyField(m_TickRateProperty);

EditorGUILayout.LabelField("Performance", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(m_ReceiveTickrateProperty);
EditorGUILayout.PropertyField(m_NetworkTickIntervalSecProperty);
EditorGUILayout.PropertyField(m_MaxReceiveEventsPerTickRateProperty);
EditorGUILayout.PropertyField(m_EventTickrateProperty);
EditorGUILayout.PropertyField(m_EnableNetworkVariableProperty);

using (new EditorGUI.DisabledScope(!m_NetworkManager.NetworkConfig.EnableNetworkVariable))
{
if (m_MaxObjectUpdatesPerTickProperty != null)
{
EditorGUILayout.PropertyField(m_MaxObjectUpdatesPerTickProperty);
}

EditorGUILayout.PropertyField(m_EnsureNetworkVariableLengthSafetyProperty);
}

Expand Down
6 changes: 3 additions & 3 deletions com.unity.multiplayer.mlapi/Prototyping/NetworkAnimator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ public enum Authority

[SerializeField]
private float m_SendRate = 0.1f;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we also kill this too? I asked the same question before in @pdeschain's NetworkAnimator PR. Do we really want to control NetworkAnimator's tickrate separately from network config's tickrate? If so, why? If not, why keep m_SendRate and its implementation around?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Most likely yes, we will want to remove this. But I don't think it should be in this PR and I think we first need to better understand how we will do NetworkVariables / priority in the future.

private float m_NextSendTime = 0.0f;
private double m_NextSendTime = 0.0f;
private bool m_ServerRequestsAnimationResync = false;
[SerializeField]
private Animator m_Animator;
Expand All @@ -270,7 +270,7 @@ public override void OnNetworkSpawn()

if (m_Animator.IsParameterControlledByCurve(parameter.nameHash))
{
//we are ignoring parameters that are controlled by animation curves - syncing the layer states indirectly syncs the values that are driven by the animation curves
//we are ignoring parameters that are controlled by animation curves - syncing the layer states indirectly syncs the values that are driven by the animation curves
continue;
}

Expand Down Expand Up @@ -373,7 +373,7 @@ private void FixedUpdate()

private bool CheckSendRate()
{
var networkTime = NetworkManager.NetworkTime;
var networkTime = NetworkManager.LocalTime.FixedTime;
if (m_SendRate != 0 && m_NextSendTime < networkTime)
{
m_NextSendTime = networkTime + m_SendRate;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ private void Awake()
}

private Vector3 m_LastDestination = Vector3.zero;
private float m_LastCorrectionTime = 0f;
private double m_LastCorrectionTime = 0d;

private void Update()
{
Expand Down Expand Up @@ -79,7 +79,7 @@ private void Update()
}
}

if (NetworkManager.NetworkTime - m_LastCorrectionTime >= CorrectionDelay)
if (NetworkManager.LocalTime.Time - m_LastCorrectionTime >= CorrectionDelay) // TODO this is not aliased correctly, is this an issue?
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IIRC in general PredictedTime was the preferred time for these computations as before; trying to understand the shift to LocalTime here. Is it something special w.r.t. NavMesh?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I changed this overall to LocalTime after talking to people inside the team and Morgane from UX. LocalTime seemed to best describe this value because on the server this is not a PredictedTime but just the local time.

{
if (!EnableProximity)
{
Expand All @@ -99,7 +99,7 @@ private void Update()
OnNavMeshCorrectionUpdateClientRpc(m_Agent.velocity, transform.position, new ClientRpcParams { Send = new ClientRpcSendParams { TargetClientIds = proximityClients.ToArray() } });
}

m_LastCorrectionTime = NetworkManager.NetworkTime;
m_LastCorrectionTime = NetworkManager.LocalTime.Time;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,28 +61,10 @@ public class NetworkConfig
internal Dictionary<uint, NetworkPrefab> NetworkPrefabOverrideLinks = new Dictionary<uint, NetworkPrefab>();

/// <summary>
/// Amount of times per second the receive queue is emptied and all messages inside are processed.
/// The tickrate of network ticks. This value controls how often MLAPI runs user code and sends out data.
/// </summary>
[Tooltip("The amount of times per second the receive queue is emptied from pending incoming messages")]
public int ReceiveTickrate = 64;

/// <summary>
/// Duration in seconds between network ticks.
/// </summary>
[Tooltip("Duration in seconds between network ticks")]
public float NetworkTickIntervalSec = 0.050f;

/// <summary>
/// The max amount of messages to process per ReceiveTickrate. This is to prevent flooding.
/// </summary>
[Tooltip("The maximum amount of Receive events to poll per Receive tick. This is to prevent flooding and freezing on the server")]
public int MaxReceiveEventsPerTickRate = 500;

/// <summary>
/// The amount of times per second internal frame events will occur, e.g. send checking.
/// </summary>
[Tooltip("The amount of times per second the internal event loop will run. This includes for example NetworkVariable checking.")]
public int EventTickrate = 64;
[Tooltip("The tickrate. This value controls how often MLAPI runs user code and sends out data. The value is in 'ticks per seconds' which means a value of 50 will result in 50 ticks being executed per second or a fixed delta time of 0.02.")]
public int TickRate = 30;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are we confident an int will always do the job ? Let's say some game wanted 30 ms fixed tick rate, for [unspecified reasons], they'd be shooting for 33.33... TickRate. Pie-in-the-sky, there would be a way to specify either an integral tick per second or an integral tick duration in ms, but a more immediate fix is to offer the TickRate as a floating-point value.
(mostly asking, not really arguing for)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not confident. But floating point tickrate introduces some potential problems. DOTS Netcode also only support integral tickrate. MLAPI also only supported integral tickrate before. I will note it down and mention it to UX.


/// <summary>
/// The amount of seconds to wait for handshake to complete before timing out a client
Expand Down Expand Up @@ -206,9 +188,7 @@ public string ToBase64()
writer.WriteString(config.RegisteredScenes[i]);
}

writer.WriteInt32Packed(config.ReceiveTickrate);
writer.WriteInt32Packed(config.MaxReceiveEventsPerTickRate);
writer.WriteInt32Packed(config.EventTickrate);
writer.WriteInt32Packed(config.TickRate);
writer.WriteInt32Packed(config.ClientConnectionBufferTimeout);
writer.WriteBool(config.ConnectionApproval);
writer.WriteInt32Packed(config.LoadSceneTimeOut);
Expand Down Expand Up @@ -249,9 +229,7 @@ public void FromBase64(string base64)
config.RegisteredScenes.Add(reader.ReadString().ToString());
}

config.ReceiveTickrate = reader.ReadInt32Packed();
config.MaxReceiveEventsPerTickRate = reader.ReadInt32Packed();
config.EventTickrate = reader.ReadInt32Packed();
config.TickRate = reader.ReadInt32Packed();
config.ClientConnectionBufferTimeout = reader.ReadInt32Packed();
config.ConnectionApproval = reader.ReadBool();
config.LoadSceneTimeOut = reader.ReadInt32Packed();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using MLAPI.Configuration;
using MLAPI.Logging;
using MLAPI.Messaging;
using MLAPI.Timing;
using MLAPI.NetworkVariable;
using MLAPI.Profiling;
using MLAPI.Reflection;
Expand Down Expand Up @@ -296,7 +297,6 @@ protected NetworkBehaviour GetNetworkBehaviour(ushort behaviourId)
/// </summary>
public ulong OwnerClientId => NetworkObject.OwnerClientId;


/// <summary>
/// Gets called when message handlers are ready to be registered and the network is setup
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,12 @@ public class NetworkBehaviourUpdater
{
private HashSet<NetworkObject> m_Touched = new HashSet<NetworkObject>();

/// <summary>
/// Stores the network tick at the NetworkBehaviourUpdate time
/// This allows sending NetworkVariables not more often than once per network tick, regardless of the update rate
/// </summary>
public ushort CurrentTick { get; set; }

#if DEVELOPMENT_BUILD || UNITY_EDITOR
private ProfilerMarker m_NetworkBehaviourUpdate = new ProfilerMarker($"{nameof(NetworkBehaviour)}.{nameof(NetworkBehaviourUpdate)}");
#endif

internal void NetworkBehaviourUpdate(NetworkManager networkManager)
{
// Do not execute NetworkBehaviourUpdate more than once per network tick
ushort tick = networkManager.NetworkTickSystem.GetTick();
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@SamuelBellomo I removed this from NetworkBehaviour and now removing this from here as well. This will be called during the network tick now, (In theory multiple times per frame but only once per network tick). This is because each a network variable could be updated by user code and we don't want to lose that information (in most cases irrelevant unless the frame rate < tick rate). Hope that makes sense.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with it, but you might want to git blame deeper on this, I'm not the original writer of that code, I copy pasted it when I moved this from NetworkBehaviour.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👋
I think I'm the original writer of that code.
The aim is really as commented. It needs to early-out so that the rest of the update happens only once per tick.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So @jeffreyrainy would you agree that this is no longer necessary if we call this directly from the tick event of our tick system which only gets called once per tick?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yep, all good. Was just providing data on the "I'm not the original writer of that code" part.

if (tick == CurrentTick)
{
return;
}

CurrentTick = tick;

#if DEVELOPMENT_BUILD || UNITY_EDITOR
m_NetworkBehaviourUpdate.Begin();
#endif
Expand Down
Loading