Skip to content

Releases: needle-mirror/com.unity.netcode

1.6.2

08 Jul 22:08

Choose a tag to compare

[1.6.2] - 2025-07-07

Added

  • UnityEngine.Time.frameCount is appended to netcode packet timestamp logs using format: [Fr{0}].

Changed

  • The client now sends - as part of its command data - some extra information regarding the command tick. In particular, it informs the server if the current command is for a full or partial update/tick. This ensure a more proper time-sync, and avoids mis-predictions.

Fixed

  • Adding GhostAuthoringComponent will now work properly for a prefab that is opened (double clicked instead of just selected).
  • Issue preventing static-optimized, not pre-spawned ghosts from spawning on clients when their first serialization result was 'zero-change' against a baseline value of default(T). They'd previously only be sent for the first time after changing.
  • Project Breaking Change: Regenerated the GUID for Packages/com.unity.netcode/Tests/Editor/Physics/Unity.NetCode.Physics.Editor.Tests.asmdef so that it would no longer clash with Packages/com.havok.physics/Plugins/Android/Havok.Physics.Plugin.Android.asmdef. Any assemblies attempting to reference Unity.NetCode.Physics.Editor.Tests by GUID d8342c4acf8f78e439367cff1a5e802f will need to be changed to bec3f262d6e6466eb2c61661da550f47.
  • An issue - due to improper time syncing in between the client and server - especially when using IPC, causing multiple side effects:
    • the client was typically only sending commands to the server for partial ticks, not full ticks, causing mis-predictions.
    • the client was slightly behind the server, thus receiving new snapshots slightly in advance, and skipping running the PredictedSimulationSystemGroup for one frame or more, causing jittery and noticeable artefacts.
  • Potential Behaviour Breaking Change: GhostInstance's GhostType is now set with the same valid value for both client and server prespawned instances. (Previously, this was always kept at an initial -1 value server side and never initialized). This way is now more consistent behaviour between client and server.

1.6.1

01 Jun 23:07

Choose a tag to compare

[1.6.1] - 2025-05-28

Added

  • Two new entity command buffer systems that run at the beginning and end of the PredictedSimulationSystemGroup respectively: BeginPredictedSimulationCommandBufferSystem and EndPredictedSimulationCommandBufferSystem.
  • A new internal PredictedSpawningSystemGroup, running after the EndPredictedSimulationCommandBufferSystem, created to guarantee that when a new snapshot is received from server, all new ghosts are spawned and ready to receive new data.
  • New documentation regarding the NetworkDriverStore architecture, setup and how to use it in conjunction with Unity.Relay.
  • Experimental host migration feature added, enabled with the ENABLE_HOST_MIGRATION define but otherwise hidden.
  • With ENABLE_HOST_MIGRATION defined, when a client reconnects to a server after disconnecting the connection entity on both sides will receive a NetworkStreamIsReconnected component. An internal unique ID is added to connections to track this behaviour.
  • The ability to define a smaller GhostSystemConstants.SnapshotHistorySize value via compiler define NETCODE_SNAPSHOT_HISTORY_SIZE_6 or NETCODE_SNAPSHOT_HISTORY_SIZE_16. These values are well suited for larger scale use-cases where server memory is constrained, and snapshot sends of individual ghosts are relatively infrequent.
  • Support for combining Ghost Relevancy with Ghost Importance Scaling via new PrioChunks.isRelevant field, enabling a fast-path for relevancy calculations.
  • Analytics to netcode tools to better understand their usage.

Changed

  • Behaviour Breaking Change: Predicted spawned ghosts for partial ticks skip restoring the state from the backup (and instead continue prediction from their spawn state) when the last backup state tick is identical to the spawn tick, as no data has changed.
  • Behaviour Breaking Change: Reduced the complexity (and performance overhead) of the GhostCount.GhostCountOnServer calculations internally. Note that this value is (and always has been) an approximation.
  • IsReconnected split into NetworkStreamIsReconnected for reconnected connections and IsMigrated for re-spawned ghosts (Host Migration).
  • Moved host migration related types into a Unity.Netcode.HostMigration namespace, renamed the HostMigration class to HostMigrationUtility so it works in the new namespace.
  • Prespawn ghost IDs will now be preserved between host migrations
  • Client connection NetworkIDs are now preserved between host migrations.

Fixed

  • Behaviour Breaking Change: Incorrect state serialized inside the SnapshotDataBuffer for predicted spawned ghost on the client when spawned inside the prediction loop. The PredictedGhostSpawnSystem is now updated also as part of the prediction loop (inside the PredictedSpawningSystemGroup) to ensure that any predicted spawned ghosts on the client are correctly initialized at the tick they are spawned, and not with partial tick state.
  • Issue where predicted spawned ghosts re-simulated from the wrong tick when configured to rollback to their spawnTick and are spawned inside the prediction loop. They are now restored using the corrected full tick state, rather than the erroneous partial tick state.
  • Enable creating and initializing server drivers when using WebGL to enable self-hosting cases using relay. Many methods were under conditional compilation flags and removed from the WebGL build and not usable outside the editor.
  • All the unmanaged systems present in the FixedStepSimulationSystemGroup that have a direct or indirect update dependency to the PhysicsSystemGroup are now correctly moved to the PredictedFixedStepSimulationSystemGroup. This is a Behaviour Change in respect the previous versions, where all the unmanaged systems continued to stay inside the fixed update group, regardless of the dependency of update order.
  • An issue with Mutiplayer PlayModeTool window, throwing exceptions when docked after a domain reload. The issue was due to because of an access to EditorPrefs and Application.productName while restoring the window state.
  • Issue where, during host migration, ghosts could be migrated with a 0 id and type. Causing various issues when instantiated on the new host.
  • Crash which could happen after host migrations when the server is deploying the host migration data.
  • Issue with prespawn prefab entity list initialization after a host migration, the ordering of the prespawn ghosts could be shifted by one because of the internal PrespawnSceneList entity prefab creation. This would result in invalid ghost type X (expected X+1) off by one style errors.
  • The prediction loop will no longer rollback too many times when one ghost is switched from predicted to interpolated, and later switched back to predicted, when that ghost is the only predicted ghost.
  • If you update multiple packages, create a new section with a new header for the other package.
  • The client packet dump was not being written to the EnablePacketLogging.NetDebugPacketCache field, thus were not usable by users and other netcode call-sites (like the NetworkStreamReceiveSystem).
  • SnapshotHistorySize values below 32 uncovered an issue where a ghost chunk being written would write over its snapshot history entries for currently-in-flight snapshots, leading to a cycle of never being able to fetch a valid baseline, in perpetuity. The fix for this requires us to stall the send of this ghost chunk if the in-flight queue is full, until the in-flight snapshots are assumed to have either arrived or been lost/dropped.
  • Buffer serialization errors caused by incorrect pointer stepping when ghost fields are not present (i.e. surrounding GhostComponentSerializer.State.HasGhostFields).
  • Buffer serialization errors caused by missing change mask invalidation when SendToOwnerType or GhostSendType conditionally prevented sending of the buffer.
  • Readded UsePreSerialization to the GhostAuthoringComponent inspector that was accidentally removed.

Obsolete

  • Prefer BatchScaleImportanceDelegate to ScaleImportanceFunction as the latter significantly reduces the total number of function pointer calls.

1.5.1

08 May 09:10

Choose a tag to compare

[1.5.1] - 2025-05-06

Added

  • Experimental host migration feature added, enabled with the ENABLE_HOST_MIGRATION define but otherwise hidden.
  • With ENABLE_HOST_MIGRATION defined, when a client reconnects to a server after disconnecting the connection entity on both sides will receive a NetworkStreamIsReconnected component. An internal unique ID is added to connections to track this behaviour.

Changed

  • IsReconnected split into NetworkStreamIsReconnected for reconnected connections and IsMigrated for re-spawned ghosts (Host Migration).

Fixed

  • An issue with Mutiplayer PlayModeTool window, throwing exceptions when docked after a domain reload. The issue was due to because of an access to EditorPrefs and Application.productName while restoring the window state.
  • Issue where, during host migration, ghosts could be migrated with a 0 id and type. Causing various issues when instantiated on the new host.
  • Crash which could happen after host migrations when the server is deploying the host migration data.
  • Issue with prespawn prefab entity list initialization after a host migration, the ordering of the prespawn ghosts could be shifted by one because of the internal PrespawnSceneList entity prefab creation. This would result in invalid ghost type X (expected X+1) off by one style errors.

1.4.1

13 May 16:10

Choose a tag to compare

[1.4.1] - 2025-04-30

Fixed

  • "Size limitation on snapshot did not prevent all errors" and improper serialization of a ghost group root when the group is empty and the available space in the data stream is not enough to encode the length of the group (0, that takes 2 bits).
  • Missing reset of the entity sent state when a group fail to serialize. The serialized children entity were incorrectly reported to be sent, potentially causing improper baseline used by the server to delta compress the data.

1.5.0

23 Apr 11:09

Choose a tag to compare

[1.5.0] - 2025-04-22

Added

  • The AutomaticThinClientWorldsUtility class, which facilitates runtime creation (and management) of thin clients. It is available to user-code, and when in PlayType.Server.
  • ClientTickRate.NumAdditionalClientPredictedGhostLifetimeTicks, which can be used to fine-tune/alleviate a common issue where correctly predicted client predicted spawns are de-spawned by the netcode package before they have an opportunity to be classified against their server-side counterparts, which is a common occurrence when said spawns replicate later than expected (which can happen for a variety of reasons). The default behaviour is to have them despawn if they have not been classified by the NetworkTime.InterpolationTick. This value extends this threshold by this many additional ticks. However, if ghosts are frequently unable to replicate by the NetworkTime.InterpolationTick, then your interpolation buffer may be too small. I.e. Consider tweaking ClientTickRate.InterpolationTimeMS (or the InterpolationTimeNetTicks equivalent) first. For further reading, refer to the interpolation docs here.
  • Exposed the k_TickPeriod range constant (defaulting to ±5 ticks) in the default classification system as ClientTickRate.DefaultClassificationAllowableTickPeriod. This may help fix esoteric default classification related errors, particularly when the server is frequently batching ticks (leading to large tick deltas). That said; prefer writing your own classification system, which can take advantage of project-specific GhostField data to more accurately classify predicted spawns.
  • ClientServerBootstrap.AllNetCodeWorldsEnumerator and ClientServerBootstrap.AllClientWorldsEnumerator helpers.
  • Doc on gotcha with custom template serialization and byte alignment.
  • Tests (and a packet dump entry & warning log) covering the case where clients are impacted by the unfathomably rare MaxBaselineAge edge-case.
  • FixedList replication support for RPC, Command, and components (IComponentData, IBufferElementData, IInputComponentData). Some limitation apply, see the doc for further info.
  • unsafe fixed buffer replication support for RPC, Command, and components (IComponentData, IBufferElementData, IInputComponentData). Some limitation apply, see the doc for further info.
  • GhostAuthoringComponent.UseSingleBaseline`, denoting that this prefab type should force 'single baseline' delta-compression during serialization, which can lead to significant CPU savings at the cost of marginally increased bandwidth consumption, particularly for ghosts with many components, and/or with many GhostField's which rarely change.
  • new templates for serializing bytes and short using 8 and 16 bits instead of a full 32 bit data, when they are sent uncompressed.
  • Static-optimized ghosts now report their CanUseStaticOptimization (CUSO) status to the packet dump (including the ComponentType of the first detected changed version), which should aid debugging efforts.
  • Broad packet dump data improvements, at the cost of worsened server performance when enabled.
  • missing documentation in regards what are the fields types for which prediction errors are reported.
  • Documentation and test coverage regarding the GhostGroup feature.
  • Test and doc coverage of [GhostField] C# unions (via [StructLayout(LayoutKind.Explicit)]), which are supported (with many caveats).
  • Test coverage of NetworkStreamSnapshotTargetSize, UTP's MaxMessageSize, and GhostSystemConstants.MaxSnapshotSendAttempts.

Changed

  • Behaviour Breaking Change: The client will now ignore the HandshakeApprovalTimeoutMS until it has completed the Handshake phase, as it should respect this servers value, rather than assuming its own. Relatedly: Be aware that client worlds will not fetch the ClientServerTickRate values from a NetCodeConfig.Global config, they will only accept values sent to it by the server during handshake.
  • Behaviour Breaking Change: The AddCommandData method will now reject inputs with Invalid Tick values, preventing runtime exceptions in rare cases.
  • Behaviour Breaking Change: The DefaultDriverConstructor no longer removes the IPC driver when RequestedPlayType == Server, as thin clients can now be instantiated on DGS builds (assuming supported by user-code).
  • Value Breaking Change: Increased the Lag Compensation Physics CollisionWorld history buffer capacity from 16 ticks to 32 ticks, as the previous buffer was too small for some use-cases. However, the default value (when using LagCompensationConfig.ServerHistorySize:0) remains at 16. Increasing this will allocate more collision worlds, increasing the memory consumption on the ServerWorld, particularly with very large physics scenes, and therefore should only be done if you intend to support high-ping players (i.e. you're often seeing PhysicsWorldHistorySingleton.GetCollisionWorldFromTick clamp a clients history to the last/oldest stored value). Also note the change to the public const PhysicsWorldHistory.RawHistoryBufferMaxCapacity (from 16 to 32).

1.5.0-exp.101

13 Mar 13:07

Choose a tag to compare

[1.5.0-exp.101] - 2025-03-13

Fixed

  • Fix broken link in the documentation.

1.5.0-exp.100

12 Mar 21:08

Choose a tag to compare

[1.5.0-exp.100] - 2025-03-11

Changed

  • Big documentation overhaul for host migration feature.
  • Don't add input component buffers to host migration data. These can cause issues after host migration when they have inputs event counters set to some value where the migrated clients will be start counts starting from 0. The increment/decrement mechanism breaks.
  • Ghost IDs and spawn ticks in the GhostInstance component will now be preserved for non-prespawn ghosts between host migrations.

Fixed

  • UpdateSize in the HostMigrationStats component is now correct when using compression
  • Issue with the native list size being incorrectly re-sized in HostMigration.GetHostMigrationData
  • Test failures when packet dumps are enabled
  • Issue where old prespawn snapshot data would still exist for clients after a host migration causing deserialization errors.

1.5.0-exp.2

11 Feb 14:07

Choose a tag to compare

[1.5.0-exp.2] - 2025-02-10

Changed

  • Added more sections to the documentation with information about what to look out for during a host migration.
  • Renamed HostMigration.MigrateServerData to HostMigration.SetHostMigrationData and made it public. It's the counterpart to GetHostMigrationData. MigrateDataToNewServerWorld is now optional to use.
  • Added a world parameter to the public APIs GetHostMigrationData/TryGetHostMigrationData.

Fixed

  • Issue where the relay connection setup would fail after host migrations. Stopped using fixed listening ports on the server.
  • Issue with incorrect host migration size being uploaded. When the host migration data blob was small it would cause errors during deployment.
  • Issue when the host configuration part of the migration data was over 1KB in size.

1.5.0-exp.1

30 Jan 10:07

Choose a tag to compare

[1.5.0-exp.1] - 2025-01-28

Added

  • The AutomaticThinClientWorldsUtility class, which facilitates runtime creation (and management) of thin clients. It is available to user-code, and when in PlayType.Server.
  • ClientTickRate.NumAdditionalClientPredictedGhostLifetimeTicks, which can be used to tune down a common issue where (correctly predicted) client predicted spawns are despawned by the netcode package before they can be classified against their server-side counterparts (i.e. which may arrive shortly after).
  • Exposed the implicit k_TickPeriod range constant (defaulting to ±5 ticks) in the default classification system as ClientTickRate.DefaultClassificationAllowableTickPeriod. This may help fix esoteric default classification related errors, particularly when the server is frequently batching ticks (leading to large tick deltas). Prefer writing your own classification system, though, which can take advantage of project-specific GhostField data.
  • Host migration feature for simple projects. APIs are provided to save the current server world state, mostly related to current ghosts (HostMigration.GetHostMigrationData) and then to deploy a given server state data blob to a new server world (HostMigration.MigrateDataToNewServerWorld). This can be used with the Unity Lobby service to better facilitate host migrations with session persistence. See Host Migration section in the manual for more information.

Changed

  • Behaviour Breaking Change: The client will now ignore the HandshakeApprovalTimeoutMS until it has completed the Handshake phase, as it should respect this servers value, rather than assuming its own. Relatedly: Be aware that client worlds will not fetch the ClientServerTickRate values from a NetCodeConfig.Global config, they will only accept values sent to it by the server during handshake.
  • Behaviour Breaking Change: The AddCommandData method will now reject inputs with Invalid Tick values, preventing runtime exceptions in rare cases.
  • Behaviour Breaking Change: The DefaultDriverConstructor no longer removes the IPC driver when RequestedPlayType == Server, as thin clients can now be instantiated on DGS builds (assuming supported by user-code).
  • Value Breaking Change: Increased the Lag Compensation Physics CollisionWorld history buffer capacity from 16 ticks to 32 ticks, as the previous buffer was too small for some use-cases. However, the default value (when using LagCompensationConfig.ServerHistorySize:0) remains at 16. Increasing this will allocate more collision worlds, increasing the memory consumption on the ServerWorld, particularly with very large physics scenes, and therefore should only be done if you intend to support high-ping players (i.e. you're often seeing PhysicsWorldHistorySingleton.GetCollisionWorldFromTick clamp a clients history to the last/oldest stored value). Also note the change to the public const PhysicsWorldHistory.RawHistoryBufferMaxCapacity (from 16 to 32).

Fixed

  • Issue where disconnecting while in the process of spawning prefabs raised the following error: "Found a ghost in the ghost map which does not have an entity connected to it. This can happen if you delete ghost entities on the client."
  • Overzealous RPC validation error when broadcasting an RPC on the same frame as a disconnection.
  • The AutomaticThinClientWorldsUtility now allows you to disable automatic in-editor thin client creation by setting BootstrapInitialization and RuntimeInitialization to null during bootstrapping.
  • Removed the limitation preventing thin clients from being created when in mode Server, including DGS builds. Ensure thin client systems are in assemblies that will be loaded on the server.
  • Bug causing user-created thin client worlds to be automatically cleaned up by the netcode package due to RequestedNumThinClients. Now, only worlds which are created via the AutomaticThinClientWorldsUtility (or manually added by user-code to its tracking list) will be automatically disposed.
  • Inconsistencies in documentation around RollbackPredictionOnStructuralChanges have been fixed and sorted out a couple of typos.
  • Issue with prespawned ghosts not updating anymore after the client disconnects and reconnects to a server.

1.4.0

28 Nov 11:09

Choose a tag to compare

[1.4.0] - 2024-11-14

Added

  • A togglable warning to display when the server is batching ticks.
  • PhysicGroupRunMode property to the NetcodePhysicsConfigAuthoring to let the user configure when the predicted physics loop should run.
  • PredictionLoopUpdateMode property to the ClientTickRate to let the user configure when the PredictionSimulationSystemGroup should update. In particular, it is allow now to have the prediction loop running all the time, regardless of the presence of predicted ghost.
  • GhostSendSystemData.MaxIterateChunks, which denotes the maximum number of chunks the GhostSendSystem will iterate over in a single tick, for a given connection, within a single NetworkTickRate snapshot send interval. It's an optimization in use-cases where you have many thousands of static ghosts (and thus hundreds of static chunks which are iterated over unnecessarily to find ones containing possible changes), but can lead to empty snapshots if set too low. Pairs well with MaxSendChunks, and defaults to 0 (OFF) to avoid a behaviour change.
  • Many Unity Transport Package NetworkConfigParameters have been added to the NetCodeConfig. They are ignored if using a custom driver, unless said driver calls the new static method DefaultDriverBuilder.AddNetcodePackageNetworkConfigParameters.
  • ClientServerTickRate.SnapshotAckMaskCapacity configures the length of the ack mask history (in ServerTicks). It is used by the snapshot system to determine whether or not a ghost has an acked baseline snapshot, and only queried when said chunk is attempting to be resent. Its new default (of 4096, up from 256) supports ~1.1 minutes (up from ~4.26 seconds) under default settings (i.e. assuming a SimulationTickRate of 60Hz). Increasing this value further can protect against the aforementioned snapshot acking errors when sending tens of thousands of ghosts to an individual client connection.
  • GhostAuthoringComponent.MaxSendRate, which denotes the maximum possible send frequency (in Hz) for ghost chunks of this ghost prefab type. Note, however, that other factors (like NetworkTickRate, ghost instance count, the use of Static-Optimization vs Dynamic, Importance, Importance-Scaling, DefaultSnapshotPacketSize etc.) will determine the final send rate. Use MaxSendRate to brute-force reduce the bandwidth consumption of your most impactful ghost types.
  • GhostCountInstantiatedOnClient and GhostCountReceivedOnClient to the GhostCount struct to differentiate ghosts which we have only received the data for, from fully instantiated ghosts (i.e. ghosts with entities). See deprecation entry and PendingSpawnPlaceholder.
  • The AutomaticThinClientWorldsUtility class, which facilitates runtime creation (and management) of thin clients. It is available to user-code, and when in PlayType.Server.

Changed

  • The error for NetworkProtocolVersion mismatches will now better indicate what exactly went wrong, and what steps can be taken to resolve the error.
  • Incremental UI improvement to the MultiplayerPlayModeWindow netcode worlds display. The server now lists ghost counts (details in tooltip), the client GhostCount singleton is now available via hovering over the ping tooltip (as it's often something you want to know), and the DriverStore drivers are now displayed consistently.
  • Re-enabled disabled LoadScenes_AllScenesShouldConnect and LoadScenes_NoScenesShouldLog tests randomly failing that were failing because of the CommandSendSystemGroup issue.
  • Behaviour Breaking Change: GhostSendSystemData.MaxSendChunks no longer limits the max number of chunks to iterate over (i.e. query) - unless GhostSendSystemData.MaxIterateChunks is zero - as it no longer counts cancelled chunk snapshot writes towards its total. Therefore, use GhostSendSystemData.MaxIterateChunks instead to denote that limit. This should lead to fewer emptier packets, particularly when used in conjunction with many static and irrelevant ghosts.
  • API & Behaviour Breaking Change: The netcode package DefaultDriverConstructor will now default to the transports NetworkParameterConstants.SendQueueCapacity and ReceiveQueueCapacity respectively (each 512), rather than our own package implementation of max(playerCount * 4, 64) where playerCount is an optional parameter defaulting to 0. This optional parameter has since been removed from CreateServerNetworkDriver and GetNetworkServerSettings, but you can instead override them via the NetCodeConfig additions (see entry). This prevents the common fatal error case when playtesting with higher player counts, and removes the most common need for a per-project INetworkStreamDriverConstructor, but is a small regression in memory consumption (~1.8MB) on both the client and the server, when using any built-in INetworkStreamDriverConstructor. We recommend configuring them back to 64 if that previously did not cause any issues.
  • The verbose "Delta time was negative. To avoid undefined behaviour the frame is skipped." log has been moved behind NetDebug.DebugLog and re-worded.
  • Merged the two internal batched and unbatched GatherGhostChunks methods. Performance characteristics of both should be practically identical.
  • Placeholder ghosts are now given the name GHOST-PLACEHOLDER-{ghostType} to aid in debugging.
  • Copy editing and improvements to the Setting up client and server worlds section of the documentation.
  • Behaviour Breaking Change: The client will now ignore the HandshakeApprovalTimeoutMS until it has completed the Handshake phase, as it should respect this servers value, rather than assuming its own. Relatedly: Be aware that client worlds will not fetch the ClientServerTickRate values from a NetCodeConfig.Global config, they will only accept values sent to it by the server during handshake.
  • Behaviour Breaking Change: The AddCommandData method will now reject inputs with Invalid Tick values, preventing runtime exceptions in rare cases.
  • Behaviour Breaking Change: The DefaultDriverConstructor no longer removes the IPC driver when RequestedPlayType == Server, as thin clients can now be instantiated on DGS builds (assuming supported by user-code).

Deprecated

  • NetworkDriverInstance.simulatorEnabled setter, as writing to it did not effectively enable and disable the simulator.
  • Behaviour Breaking Change: GhostSendSystemData.MaxSendEntities no longer functions, as it was somewhat misleading, and less precise than MaxSendChunks and MaxIterateChunks.
  • Renamed GetNetworkSettings to GetNetworkClientSettings.
  • GhostCount.GhostCountOnClient has been deprecated as it is ambiguous: Its value is the same as the new GhostCountReceivedOnClient, but its tooltip incorrectly implied that it was the GhostCountInstantiatedOnClient.

Fixed

  • MultiplayerPlayModeWindow issue where the width of the server world buttons were erroneously causing a Horizontal Scrollbar. Also removed slightly excessive repainting.
  • Limitation preventing the MultiplayerPlayModeWindow from being resized when undocked.
  • CommandSendSystemGroup running systems when the current server tick is invalid, CommandSendPacketSystem (and other system potentially) throwing exceptions.
  • an issue when using physics interpolation, causing graphical jitter on the replicated ghost when the physics system run on partial ticks.
  • It is possible now to allow physics to run in the prediction loop even in case no predicted ghosts are present. This can be achieved by combining the PredictionLoopUpdateMode and PhysicGroupRunMode options.
  • an issue with netcode source generated files, causing multiple Burst.CompileAsync invocation, ending up in stalling the editor and the player for long time, and / or causing crashes.
  • Critical GhostSendSystem and GhostChunkSerializer issue preventing ghosts from successfully acking their own previous snapshots, in cases where the next attempted resend of a ghost chunk exceeded 256 ticks (easily encountered when attempting to replicate thousands of ghosts to a single connection). Whenever a ghost chunk is unable to ack, larger deltas must be resent, and static optimization early-outing logic cannot be applied, causing unnecessary bandwidth and CPU consumption. While this issue did tend to stabilize over time, our initial fix is to increase this ack window considerably (see ClientServerTickRate.SnapshotAckMaskCapacity entry).
  • Prevented the GhostAuthoringInspectionComponent from erroneously re-baking the ghost while the user is editing a property on said ghost prefab (applicable only when in 'Auto-Refresh' mode).
  • MinSendImportance no longer artificially delays the initial send of ghosts with low importance values (although this was mitigatable via FirstSendImportanceMultiplier).
  • Issue with ElapsedTime in server worlds where it could fall behind compared to InitializationSystemGroup's if the frame's deltaTime was going over MaxSimulationStepsPerFrame * MaxSimulationStepBatchSize settings. This changes the catch up behaviour server side. Previously, the server would skip ticks if batching wasn't enough while now it'll do its best to catchup on those missing ticks on the subsequent frames if time allows.
  • Issue where Netcode's ElapsedTime could be ahead of the InitializationSystemGroup elapsed time in server worlds. It should now either always be equal to or slightly behind if not enough time has accumulated for a tick to execute.
  • Issue where disconnecting while in the process of spawning prefabs raised the following error: "Found a ghost in the ghost map which does not have an entity connected to it. This can happen if you delete ghost entities on the client."
  • Overzealous RPC validation error when broadcasting an RPC on the same frame as a disconnection.
  • The AutomaticThinClientWorldsUtility now allows you to disable automatic in-editor thin client creation by setting `Boot...
Read more