Skip to content

Commit 44fa025

Browse files
author
Unity Technologies
committed
## [1.8.0] - 2025-08-17 ### Added * The Playmode Tool's Importance Visualizer drawer that helps visualize Importance Scaling outcomes. * The `GhostDistancePartitioningSystem.AutomaticallyAddGhostDistancePartitionSharedComponent`, which allows you to opt-out of the default behaviour (of always adding a `GhostDistancePartitionShared` to all valid ghost instances), enabling you to filter your importance scaling on the existence of this shared component (without having to rip out the entire implementation). * Test coverage of `GhostImportance.BatchScaleImportanceFunction` and `GhostImportance.ScaleImportanceFunction` has been improved (via NetcodeSamples tests), particularly in cases where the `GhostDistancePartitionShared` (or user-code equivalent) is only added to a subset of all ghosts (i.e. used as a filter). * Support for Forced Input Latency via `ClientTickRate.ForcedInputLatencyTicks`, with new fields `NetworkTime.InputTargetTick` and `NetworkTime.EffectiveInputLatencyTicks`, and new input system `ApplyCurrentInputBufferElementToInputDataForGatherSystem<TInputComponentData, TInputHelper>` (which was needed to correctly handle `IInputComponentData` incremental values). * `NetworkTime.NumPredictedTicksExpected` denotes the (un-batched) number of predicted ticks that the client is expected to run within this prediction loop update. * [Experimental] Server and Client Profiler Modules for the Unity Profiler Window as an alternative to the web profiler. Adds new stats and includes per-component stats. Requires Unity 6 or newer. Set the script define NETCODE_PROFILER_ENABLED to enable this feature. ### Changed * **Behaviour Breaking Change:** `GhostDistanceImportance` scale functions no longer multiply the `baseImportance` by 1000, as that is now performed automatically by the `GhostSendSystem` (see new `GhostSystemConstants.ImportanceScalingMultiplier` constant), removing the final importance 1000x discrepancy between ghost chunks that use importance scaling, and ones that don't. * Input systems that write the `NetworkTime.ServerTick` into `AddCommandData` calls should instead use `InputTargetTick` for correctness. This value only differs from `ServerTick` when input latency is encountered (see `ForcedInputLatencyTicks` and `MaxPredictAheadTimeMS`). * `NetworkTime.ToFixedString` output has been extended to reflect the new Forced Input Latency data. * Updated com.unity.transport dependency to 2.5.3 from 2.4.0 ### Fixed * Instead of constantly mispredicting, `MaxPredictAheadTimeMS` will now correctly add forced input latency to the client when said clients RTT is higher than this value. * A potential crash with buffers and prediction switching stripping when your prefab contained a non-zero sized IBufferElementData that was marked for prediction/interpolation only. When restoring any buffer to their prefab value, the wrong length was used, potentially leading to a memcpy overwriting memory.
1 parent 1d049e6 commit 44fa025

File tree

149 files changed

+7372
-1119
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

149 files changed

+7372
-1119
lines changed

.attestation.p7m

0 Bytes
Binary file not shown.

.signature

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"timestamp":1753877632,"signature":"KkAZbQd5MB2fsSvlsUUKKbhBcYfOHqmseBGJIu0xboeZa5TPo2Z1VhGAkPjFq/9Usf6LLJcJmZFeH6uZ2WUSfyrB5RKyWLwMfSxTZEOIc9ZvckcU5E7FYqTXTizsJejp4Xd8YVrYZmokGtNwPYt5yAXF4UvEujAIJZ86JcvW+FU6mpl27IigpQfTJl5iHwt/qKDXCXmC9n2m/kXVkyC7X3LRb7zavloAZ27wLaKF7vZdZ1YLbRSv0tKnswcCzqhqHl6FNIEEiqLIkoB5ifsGg8g8hfXjUrtv/VrqCWvGV9HFN1ovL2FW/rhavjvWwx2LCaHWdOFAPReEle5ZydzL/+DgI8hH5auSANO8HjIHxk/owSPcdnRWYpwGaITnVeGjFmJ4lT6O6oam3r+9byczbEsV4Z0KihyUaB0bQc/fh4PGLZZeadW9cUC7QRfCfvBTw1rinfUDyk5Akvu2+W6PGtN809bMRkeE1wT/MFY1oGWBy1V36/Gadg1h8yMtDLsB","publicKey":"LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQm9qQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FZOEFNSUlCaWdLQ0FZRUFzdUhXYUhsZ0I1cVF4ZEJjTlJKSAordHR4SmoxcVY1NTdvMlZaRE1XaXhYRVBkRTBEMVFkT1JIRXNSS1RscmplUXlERU83ZlNQS0ZwZ1A3MU5TTnJCCkFHM2NFSU45aHNQVDhOVmllZmdWem5QTkVMenFkVmdEbFhpb2VpUnV6OERKWFgvblpmU1JWKytwbk9ySTRibG4KS0twelJlNW14OTc1SjhxZ1FvRktKT0NNRlpHdkJMR2MxSzZZaEIzOHJFODZCZzgzbUovWjBEYkVmQjBxZm13cgo2ZDVFUXFsd0E5Y3JZT1YyV1VpWXprSnBLNmJZNzRZNmM1TmpBcEFKeGNiaTFOaDlRVEhUcU44N0ZtMDF0R1ZwCjVNd1pXSWZuYVRUemEvTGZLelR5U0pka0tldEZMVGdkYXpMYlpzUEE2aHBSK0FJRTJhc0tLTi84UUk1N3UzU2cKL2xyMnZKS1IvU2l5eEN1Q20vQWJkYnJMbXk0WjlSdm1jMGdpclA4T0lLQWxBRWZ2TzV5Z2hSKy8vd1RpTFlzUQp1SllDM0V2UE16ZGdKUzdGR2FscnFLZzlPTCsxVzROY05yNWdveVdSUUJ0cktKaWlTZEJVWmVxb0RvSUY5NHpCCndGbzJJT1JFdXFqcU51M3diMWZIM3p1dGdtalFra3IxVjJhd3hmcExLWlROQWdNQkFBRT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg"}
1+
{"timestamp":1755424786,"signature":"YBUJl53Rqd2W72Ig5cNuc0OGlYbt0OSu1fYJDfhZMZBw4u/ra85wkXgy3CJ+V/Pa+m8/3Txtqv5SyJGwnXMjYQ/vM8k7pfEvmQ5bWt6N5frIncPvKThwJ+20d0rxR5MSKqYI91fy2vp3mEi1/smKMlP5dTDj0rfuV6HwSjuAJFGfl4ecKnVazFG06ZQq5nwsEnVkLew1qJT/xva6s6mY1oxI9bHZ8myTJeMLI9OeONKkHroscl7S4ZLMi3EVI6RZTmjyAISdVp1werb3K4+qNMCkjoB/sNKvRW2bI2UU/NaxhnHdQIHkURJaLa23J1QiGJGGP0dt/yz65r4GwQd/8VkpioXWKhI3hNtYVvyiBdBLl+X7R0aRNRaOKEoWzIB9Lg8wFMueiYK5m31PZcKX21pT218IPxjDmYfZ8+75uQHjtvmtU8Yh/nwFO/ysgN35P17OcH3Li/kuJ5wvl5LJUPrvyImbPhvuhYsXPl39nBd8rLsL6zAVTlPW1pD9dndv","publicKey":"LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQm9qQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FZOEFNSUlCaWdLQ0FZRUFzdUhXYUhsZ0I1cVF4ZEJjTlJKSAordHR4SmoxcVY1NTdvMlZaRE1XaXhYRVBkRTBEMVFkT1JIRXNSS1RscmplUXlERU83ZlNQS0ZwZ1A3MU5TTnJCCkFHM2NFSU45aHNQVDhOVmllZmdWem5QTkVMenFkVmdEbFhpb2VpUnV6OERKWFgvblpmU1JWKytwbk9ySTRibG4KS0twelJlNW14OTc1SjhxZ1FvRktKT0NNRlpHdkJMR2MxSzZZaEIzOHJFODZCZzgzbUovWjBEYkVmQjBxZm13cgo2ZDVFUXFsd0E5Y3JZT1YyV1VpWXprSnBLNmJZNzRZNmM1TmpBcEFKeGNiaTFOaDlRVEhUcU44N0ZtMDF0R1ZwCjVNd1pXSWZuYVRUemEvTGZLelR5U0pka0tldEZMVGdkYXpMYlpzUEE2aHBSK0FJRTJhc0tLTi84UUk1N3UzU2cKL2xyMnZKS1IvU2l5eEN1Q20vQWJkYnJMbXk0WjlSdm1jMGdpclA4T0lLQWxBRWZ2TzV5Z2hSKy8vd1RpTFlzUQp1SllDM0V2UE16ZGdKUzdGR2FscnFLZzlPTCsxVzROY05yNWdveVdSUUJ0cktKaWlTZEJVWmVxb0RvSUY5NHpCCndGbzJJT1JFdXFqcU51M3diMWZIM3p1dGdtalFra3IxVjJhd3hmcExLWlROQWdNQkFBRT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg"}

CHANGELOG.md

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,31 @@
22
uid: changelog
33
---
44

5+
## [1.8.0] - 2025-08-17
6+
7+
### Added
8+
9+
* The Playmode Tool's Importance Visualizer drawer that helps visualize Importance Scaling outcomes.
10+
* The `GhostDistancePartitioningSystem.AutomaticallyAddGhostDistancePartitionSharedComponent`, which allows you to opt-out of the default behaviour (of always adding a `GhostDistancePartitionShared` to all valid ghost instances), enabling you to filter your importance scaling on the existence of this shared component (without having to rip out the entire implementation).
11+
* Test coverage of `GhostImportance.BatchScaleImportanceFunction` and `GhostImportance.ScaleImportanceFunction` has been improved (via NetcodeSamples tests), particularly in cases where the `GhostDistancePartitionShared` (or user-code equivalent) is only added to a subset of all ghosts (i.e. used as a filter).
12+
* Support for Forced Input Latency via `ClientTickRate.ForcedInputLatencyTicks`, with new fields `NetworkTime.InputTargetTick` and `NetworkTime.EffectiveInputLatencyTicks`, and new input system `ApplyCurrentInputBufferElementToInputDataForGatherSystem<TInputComponentData, TInputHelper>` (which was needed to correctly handle `IInputComponentData` incremental values).
13+
* `NetworkTime.NumPredictedTicksExpected` denotes the (un-batched) number of predicted ticks that the client is expected to run within this prediction loop update.
14+
* [Experimental] Server and Client Profiler Modules for the Unity Profiler Window as an alternative to the web profiler. Adds new stats and includes per-component stats. Requires Unity 6 or newer. Set the script define NETCODE_PROFILER_ENABLED to enable this feature.
15+
16+
### Changed
17+
18+
* **Behaviour Breaking Change:** `GhostDistanceImportance` scale functions no longer multiply the `baseImportance` by 1000, as that is now performed automatically by the `GhostSendSystem` (see new `GhostSystemConstants.ImportanceScalingMultiplier` constant), removing the final importance 1000x discrepancy between ghost chunks that use importance scaling, and ones that don't.
19+
* Input systems that write the `NetworkTime.ServerTick` into `AddCommandData` calls should instead use `InputTargetTick` for correctness. This value only differs from `ServerTick` when input latency is encountered (see `ForcedInputLatencyTicks` and `MaxPredictAheadTimeMS`).
20+
* `NetworkTime.ToFixedString` output has been extended to reflect the new Forced Input Latency data.
21+
* Updated com.unity.transport dependency to 2.5.3 from 2.4.0
22+
23+
### Fixed
24+
25+
* Instead of constantly mispredicting, `MaxPredictAheadTimeMS` will now correctly add forced input latency to the client when said clients RTT is higher than this value.
26+
* A potential crash with buffers and prediction switching stripping when your prefab contained a non-zero sized IBufferElementData that was marked for prediction/interpolation only. When restoring any buffer to their prefab value, the wrong length was used, potentially leading to a memcpy overwriting memory.
27+
28+
29+
530
## [1.7.0] - 2025-07-29
631

732
### Added
@@ -12,9 +37,9 @@ uid: changelog
1237

1338
* Removed `ENABLE_HOST_MIGRATION` define which hid the host migration feature, it's now enabled by default. This also enables by default the `NetworkStreamIsReconnected` component which works without host migration.
1439
* Refactor host migration API
15-
* Removed `MigrateDataToNewServerWorld`/`ConfigureClientAndConnect` helper functions. They'll be in the docs and sample instead.
16-
* Renamed `HostMigrationUtility`->`HostMigrationData` and in that class renamed `Get/SetHostMigrationData` to `Get/Set` (class only contains data methods) with parameters reflecting directionality of data buffer and world. Removed `TryGetHostMigrationData`, use `Get` instead (native list version).
17-
* Removed `DataStorageMethod` as it no only has one enum value.
40+
* Removed `MigrateDataToNewServerWorld`/`ConfigureClientAndConnect` helper functions. They'll be in the docs and sample instead.
41+
* Renamed `HostMigrationUtility`->`HostMigrationData` and in that class renamed `Get/SetHostMigrationData` to `Get/Set` (class only contains data methods) with parameters reflecting directionality of data buffer and world. Removed `TryGetHostMigrationData`, use `Get` instead (native list version).
42+
* Removed `DataStorageMethod` as it no only has one enum value.
1843
* The ghost component serialization method in the host migration feature changed to a much better performing one.
1944

2045
### Fixed
@@ -23,8 +48,6 @@ uid: changelog
2348
* Issue where `NetCodeConfig.EnableClientServerBootstrap` was not visible within the `NetCodeConfig`.
2449
* Issue when running a webgl player where you could not connect or receive connections from non-webgl platform players.
2550

26-
27-
2851
## [1.6.2] - 2025-07-07
2952

3053
### Added

Documentation~/TableOfContents.md

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
* [Netcode for Entities package](index.md)
2-
* [Installing](installation.md)
3-
* [Setting up client and server worlds](set-up-client-server-worlds.md)
2+
* [Install](installation.md)
3+
* [Set up client and server worlds](set-up-client-server-worlds.md)
44
* [Client and server worlds networking model](client-server-worlds.md)
55
* [Network protocol checks](network-protocol-checks.md)
66
* [Netcode for Entities multi-driver architecture](networking-network-drivers.md)
77
* [Use Unity Relay with Netcode for Entities](networking-using-relay.md)
8-
* [Creating multiplayer gameplay](creating-multiplayer-gameplay.md)
8+
* [Create multiplayer gameplay](creating-multiplayer-gameplay.md)
99
* [Connecting server and clients](network-connection.md)
1010
* [Synchronizing states and inputs](synchronization.md)
1111
* [Synchronization with ghosts](ghosts.md)
@@ -37,15 +37,19 @@
3737
* [Lobby and Relay integration](host-migration/lobby-relay-integration.md)
3838
* [Limitations and known issues](host-migration/host-migration-limitations.md)
3939
* [Ghost type templates](ghost-types-templates.md)
40-
* [Testing and debugging your game](debugging.md)
40+
* [Test and debug your game](debugging.md)
4141
* [Logging](logging.md)
4242
* [Using the PlayMode Tool](playmode-tool.md)
4343
* [Testing with thin clients](thin-clients.md)
4444
* [Gathering metrics with MetricsMonitorComponent](metrics.md)
4545
* [Using source generators](source-generators.md)
46-
* [Optimizing performance](optimizing.md)
47-
* [Optimizing your game](optimizations.md)
48-
* [Data compression](compression.md)
46+
* [Optimize performance](optimizations.md)
47+
* [Optimize ghosts](optimization/optimize-ghosts.md)
48+
* [Reduce prediction overhead](optimization/reduce-prediction-overhead.md)
49+
* [Manage serialization costs](optimization/manage-serialization-costs.md)
50+
* [Limit snapshot size](optimization/limit-snapshot-size.md)
51+
* [Execute expensive operations during off frames](optimization/off-frame.md)
52+
* [Data compression](optimization/compression.md)
4953
* [Samples](samples.md)
5054
* [Networked cube](networked-cube.md)
5155
* [Host migration in Asteroids](host-migration/host-migration-sample.md)

Documentation~/creating-multiplayer-gameplay.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Creating multiplayer gameplay
1+
# Create multiplayer gameplay
22

33
Create multiplayer gameplay in Netcode for Entities.
44

Documentation~/debugging.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Testing and debugging your game
1+
# Test and debug your game
22

33
Test and debug your game using tools available for Netcode for Entities.
44

Documentation~/ghost-snapshots.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ E.g. `NetworkTickRate:30Hz`, `MaxSendRate:45` means 30Hz is the actual maximum s
4242

4343
### __Optimization Mode__ options
4444

45-
* __Dynamic__: The ghost is optimized for a small snapshot size when both changing and not changing.
46-
* __Static__: The ghost isn't optimized for a small snapshot size when changing, but isn't sent at all when it's not changing.
45+
* __Dynamic__: This is the default setting. Use this when you expect the ghost to change often. The ghost is optimized for a small snapshot size when both changing and not changing.
46+
* __Static__: Use this when you expect the ghost to change infrequently. The ghost isn't optimized for a small snapshot size when changing, but isn't sent at all when it's not changing.
4747

4848
## Structural changes on instantiated ghosts
4949

Documentation~/ghostfield-synchronize.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,4 +149,4 @@ Refer to [how to use and write templates](ghost-types-templates.md#defining-addi
149149
- [Ghost types templates](ghost-types-templates.md)
150150
- [Ghost variants](ghost-variants.md)
151151
- [Customizing replication with `GhostComponentAttribute`](ghostcomponentattribute.md)
152-
- [Preserializing ghosts](optimizations.md#preserialization)
152+
- [Preserialize ghosts](optimization/optimize-ghosts.md#preserialize-ghosts)

Documentation~/interpolation.md

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,25 @@ The term dead reckoning is also used in a similar context as extrapolation, but
3333
3434
## Timelines
3535

36-
Any given client has two timelines at the same time: the [predicted](intro-to-prediction.md) timeline that runs in your game's 'present', and the interpolated timeline that shows delayed (due to network latency) server values. Refer to the [time synchronization page](time-synchronization.md) for more details.
36+
Clients operate on three different timelines simultaneously:
37+
1. The client input target tick timeline (i.e. the 'present') - which must be ahead of the server to ensure that inputs you poll are sent to the server in time to be processed (by said server).
38+
2. The [client predicted](intro-to-prediction.md) timeline - which is where the client non-authoritatively predicts its own future position - which typically runs on the same timeline as the input gathering timeline above, except when [Forced Input Latency](optimizations.md#using-forcedinputlatencyticks) is enabled.
39+
3. The interpolated timeline - which runs behind the server authoritative simulation timeline, as it plays back interpolated `GhostField` values from received snapshots, and is therefore delayed by `RTT/2 + InterpolationTimeNetTicks`. Refer to the [time synchronization page](time-synchronization.md) for more details.
3740

38-
Server-side, there's only one timeline: the present timeline.
41+
Server-side, there's only one timeline:
42+
* The server authoritative simulation timeline (i.e. the 'present' from its POV).
3943

40-
In total, there are three timelines:
44+
> [!NOTE]
45+
> The server is the authority on the current time (& tick), as well as the rate at which time passes.
4146
42-
- The server's present timeline (`NetworkTime.ServerTick`)
43-
- The client's predicted timeline (`NetworkTime.ServerTick`)
44-
- The client's interpolated timeline (`NetworkTime.InterpolationTick`).
47+
Therefore, in total, there are four timelines (or 3, if not using Forced Input Latency):
48+
49+
| Timeline | Fields | Timeline Offset (ignoring `deltaTime` smoothing) |
50+
|-----------------------------------------------|-----------------------------------------------------------------------------------------------------------|------------------------------------------------------------|
51+
| The client's input target tick timeline | `NetworkTime.InputTargetTick (ClientWorld)` | T + (RTT/2 + TargetCommandSlack) |
52+
| The client's client prediction timeline | `NetworkTime.ServerTick (ClientWorld)` &<br/>`NetworkTime.ServerTickFraction (ClientWorld)` | T + (RTT/2 + TargetCommandSlack) - ForcedInputLatencyTicks |
53+
| The server's authoritative simulation timeline | `NetworkTime.ServerTick (ServerWorld)` | T |
54+
| The client's interpolated timeline | `NetworkTime.InterpolationTick (ClientWorld)` &<br/>`NetworkTime.InterpolationTickFraction (ClientWorld)` | T - (RTT/2 + InterpolationTimeNetTicks) |
4555

4656
![Timelines.jpg](images/PredictionSteps/Timelines.jpg)
4757

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Data compression
2+
3+
Use data compression to reduce bandwidth consumption, minimizing the likelihood that a player will experience gameplay issues as a result of bandwidth limitations.
4+
5+
> [!NOTE]
6+
> Netcode for Entities defaults to a bandwidth-intensive snapshot send configuration to enable you to get up and running quickly. It's expected and recommended that you modify the default bandwidth consumption before releasing a game into production. Refer to the [optimizing performance page](../optimizations.md) for more information about ways to optimize your game.
7+
8+
## Quantization
9+
10+
Quantization involves limiting the precision of data for the sake of reducing the number of bits required to send and receive that data. A float takes up 32 bits, giving it an approximate range of `±1.5 x 10^−45 to ±3.4 x 10^38` with the IEC 60559 standard, which is more precision than most games need. For example, if you don't need millimeter precision, setting a quantization value of `100` cuts off all sub-millimeter noise from your floats, reducing the amount of bits required to send your float values.
11+
12+
Quantization can cause issues when used with client-side prediction. Refer to the [prediction edge cases page](../prediction-details.md) for more details.
13+
14+
### Compression model
15+
16+
Netcode's quantization is optimized for [Huffman delta compression](https://en.wikipedia.org/wiki/Huffman_coding) to be executed on top of it, which means that you'll get the most bandwidth gains by sending small values (including small deltas between values).
17+
18+
For example, sending `123456789.123456789` (for a new ghost spawn, for example, where delta compression will delta against a baseline of 0) with a quantization value of `10` would result in Netcode replicating a value of `1234567891`, which wouldn't produce much optimization at all, since the number of bits used to Huffman encode a delta of `1234567891` is large. Since the Netcode for Entities compression model uses buckets of values to compress, with lower values getting a lower bit count, you won't see much difference in compression between different high values, but you will with low values.
19+
20+
So sending `0.123456789` with a quantization value of `10` would send only the value `1`. Huffman compression would use only 3 bits for this. Quantization of `100` would use 7 bits, `1000` would use 13 bits etc. You can test this yourself using `StreamCompressionModel.Default.GetCompressedSizeInBits(some_uint_value)`. To test the size of `0.123456789` with Quantization of `100`, multiply 0.123456789 by 100, cast to uint (cut off the digits after the comma) and call `StreamCompressionModel.Default.GetCompressedSizeInBits(12)`.
21+
22+
## Delta compression
23+
24+
As mentioned above, sending smaller values results in smaller amount of bits needed for the same type. A 32 bit float can be sent using less than 8 bits if it only changes a little. Games are usually composed of objects moving in small steps (rather than constantly teleporting), and sending the delta between each value change instead of the absolute value each time results in great bandwidth optimization gains. Use the [`Composite` property on `GhostFieldAttribute`](https://docs.unity3d.com/Packages/com.unity.netcode@latest?subfolder=/api/Unity.NetCode.GhostFieldAttribute.html#Unity_NetCode_GhostFieldAttribute_Composite) to customize delta compression for a component.
25+
26+
Note that delta compression is calculated against a baseline. For [pre-spawned ghosts](../ghost-spawning.md#pre-spawned-ghosts), this baseline is updated against the ghost's initial value instead of zero.

0 commit comments

Comments
 (0)