diff --git a/Source/Engine/Networking/INetworkObject.h b/Source/Engine/Networking/INetworkObject.h
index 457811557..932c3aa0d 100644
--- a/Source/Engine/Networking/INetworkObject.h
+++ b/Source/Engine/Networking/INetworkObject.h
@@ -13,22 +13,27 @@ API_INTERFACE(Namespace = "FlaxEngine.Networking") class FLAXENGINE_API INetwork
DECLARE_SCRIPTING_TYPE_MINIMAL(INetworkObject);
public:
///
- /// Event called when network objects gets spawned.
+ /// Event called when network object gets spawned.
///
- API_FUNCTION() virtual void OnNetworkSpawn() = 0;
+ API_FUNCTION() virtual void OnNetworkSpawn() {};
///
- /// Event called when network objects gets despawned.
+ /// Event called when network object gets despawned.
///
- API_FUNCTION() virtual void OnNetworkDespawn() = 0;
+ API_FUNCTION() virtual void OnNetworkDespawn() {};
///
/// Event called before network object gets replicated (before reading data).
///
- API_FUNCTION() virtual void OnNetworkSerialize() = 0;
+ API_FUNCTION() virtual void OnNetworkSerialize() {};
///
- /// Event called when network objects gets replicated (after reading data).
+ /// Event called when network object gets replicated (after reading data).
///
- API_FUNCTION() virtual void OnNetworkDeserialize() = 0;
+ API_FUNCTION() virtual void OnNetworkDeserialize() {};
+
+ ///
+ /// Event called when network object gets synced (called only once upon initial sync).
+ ///
+ API_FUNCTION() virtual void OnNetworkSync() {};
};
diff --git a/Source/Engine/Networking/NetworkReplicator.cpp b/Source/Engine/Networking/NetworkReplicator.cpp
index 8d0ba3c0e..0a0319196 100644
--- a/Source/Engine/Networking/NetworkReplicator.cpp
+++ b/Source/Engine/Networking/NetworkReplicator.cpp
@@ -111,6 +111,7 @@ struct NetworkReplicatedObject
uint8 Spawned : 1;
DataContainer TargetClientIds;
INetworkObject* AsNetworkObject;
+ bool NetworkObjectSync = false;
NetworkReplicatedObject()
{
@@ -637,7 +638,14 @@ void InvokeObjectReplication(NetworkReplicatedObject& item, uint32 ownerFrame, b
}
if (item.AsNetworkObject)
+ {
item.AsNetworkObject->OnNetworkDeserialize();
+ if (!item.NetworkObjectSync)
+ {
+ item.AsNetworkObject->OnNetworkSync();
+ item.NetworkObjectSync = true;
+ }
+ }
// Speed up replication of client-owned objects to other clients from server to reduce lag (data has to go from client to server and then to other clients)
if (NetworkManager::IsServer())