Skip to content

Commit d9406ff

Browse files
author
Unity Technologies
committed
com.unity.netcode@0.1.0-preview.6
## [0.1.0-preview.6] - 2020-02-24 ### New features * Added integration with UnityPhysics, including the lag compensation from DotsSample. To use it you must have the UnityPhysics added to your project. ### Changes * Unity Transport has been upgraded to 0.3.0 which required some API changes - see "Upgrade guide". * All `FunctionPointer` instances are cached in statics to reduce the number of calls to compile. * The helper method RpcExecutor.ExecuteCreateRequestComponent returns the entity it creates. * Added an interface to NetworkStreamReceiveSystem which is used when creating the driver. It is possible to set NetworkStreamReceiveSystem.s_DriverConstructor to a custom instance during bootstrapping to create drivers in a custom way. * Removed World.Active workaround since it has been deprecated for a while and is causing problems with conversion at runtime. * Slightly improved performance by ensuring that all jobs that can be Burst compiled are * Ghost types are now selected based on the guid of the ghosts prefab asset instead of the archetype. This makes it possible to have multiple different ghosts with the same archetype. If a ghost is not a valid prefab you will get an error during conversion. ### Fixes * Fixed an issue where ghost prefabs created from GameObject instances were processed by all systems. * The code gen now only writes files if they are modified. * Disposing a client or server world will now unregister it from the tick system to prevent errors. * Take the latency of command age updates into account when calculating time scale to get more stable inputs with high ping. ### Upgrade guide Unity Transport has been upgraded to 0.3.0 which changes the API for `DataStreamReader` and `DataStreamWriter`. The `IRpcCommand` and `ICommandData` have been changed to not take a `DataStreamReader.Context`. The `ISnapshotData` and GhostCollection interfaces have been changed to not take a `DataStreamReader.Context`, all ghosts and collections must be regenerated. `GhostDistanceImportance.NoScale` and `GhostDistanceImportance.DefaultScale` have been replaced by `GhostDistanceImportance.NoScaleFunctionPointer` and `GhostDistanceImportance.DefaultScaleFunctionPointer` which are compiled function pointers rather than methods.
1 parent 09651ea commit d9406ff

File tree

132 files changed

+5119
-668
lines changed

Some content is hidden

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

132 files changed

+5119
-668
lines changed

CHANGELOG.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,33 @@
11
# Change log
22

3+
## [0.1.0-preview.6] - 2020-02-24
4+
### New features
5+
* Added integration with UnityPhysics, including the lag compensation from DotsSample. To use it you must have the UnityPhysics added to your project.
6+
7+
### Changes
8+
* Unity Transport has been upgraded to 0.3.0 which required some API changes - see "Upgrade guide".
9+
* All `FunctionPointer` instances are cached in statics to reduce the number of calls to compile.
10+
* The helper method RpcExecutor.ExecuteCreateRequestComponent returns the entity it creates.
11+
* Added an interface to NetworkStreamReceiveSystem which is used when creating the driver. It is possible to set NetworkStreamReceiveSystem.s_DriverConstructor to a custom instance during bootstrapping to create drivers in a custom way.
12+
* Removed World.Active workaround since it has been deprecated for a while and is causing problems with conversion at runtime.
13+
* Slightly improved performance by ensuring that all jobs that can be Burst compiled are
14+
* Ghost types are now selected based on the guid of the ghosts prefab asset instead of the archetype. This makes it possible to have multiple different ghosts with the same archetype. If a ghost is not a valid prefab you will get an error during conversion.
15+
16+
### Fixes
17+
* Fixed an issue where ghost prefabs created from GameObject instances were processed by all systems.
18+
* The code gen now only writes files if they are modified.
19+
* Disposing a client or server world will now unregister it from the tick system to prevent errors.
20+
* Take the latency of command age updates into account when calculating time scale to get more stable inputs with high ping.
21+
22+
### Upgrade guide
23+
Unity Transport has been upgraded to 0.3.0 which changes the API for `DataStreamReader` and `DataStreamWriter`.
24+
25+
The `IRpcCommand` and `ICommandData` have been changed to not take a `DataStreamReader.Context`.
26+
27+
The `ISnapshotData` and GhostCollection interfaces have been changed to not take a `DataStreamReader.Context`, all ghosts and collections must be regenerated.
28+
29+
`GhostDistanceImportance.NoScale` and `GhostDistanceImportance.DefaultScale` have been replaced by `GhostDistanceImportance.NoScaleFunctionPointer` and `GhostDistanceImportance.DefaultScaleFunctionPointer` which are compiled function pointers rather than methods.
30+
331
## [0.0.4-preview.0] - 2019-12-12
432
### New features
533
### Changes

Documentation~/getting-started.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ This documentation provides a walkthrough of how to create a very simple client
44
## Set up the Project
55
Open the __Unity Hub__ and create a new Project. **Note:** To use Unity NetCode you must have at least Unity 2019.3.b11 installed.
66

7-
Open the Package Manager (menu: __Window > Package Manager__). At the top of the window, under __Advanced__, select __Show preview packages__. Add the Entities, Hybrid Renderer, NetCode, and Transport packages.
7+
Open the Package Manager (menu: __Window > Package Manager__). At the top of the window, under __Advanced__, select __Show preview packages__. Add the Entities, Hybrid Renderer, NetCode, and Transport packages.
88

99
## Create an initial Scene
1010

@@ -20,9 +20,9 @@ Once you set this up you can, for example, spawn a plane in both the client and
2020

2121
## Create a ghost Prefab
2222

23-
To make your Scene run with a client / server setup you need to create a definition of the networked object, which is called a **ghost**.
23+
To make your Scene run with a client / server setup you need to create a definition of the networked object, which is called a **ghost**.
2424

25-
To create a ghost Prefab, create a cube in the Scene (right click on the Scene and select __3D Object > Cube__). Then select the Cube GameObject under the Scene and drag it into the Project’s __Asset__ folder. This creates a Prefab of the Cube.
25+
To create a ghost Prefab, create a cube in the Scene (right click on the Scene and select __3D Object > Cube__). Then select the Cube GameObject under the Scene and drag it into the Project’s __Asset__ folder. This creates a Prefab of the Cube.
2626

2727
![Create a Cube Prefab](images/cube-prefab.png)<br/>_Create a Cube Prefab_
2828

@@ -40,13 +40,13 @@ public struct MovableCubeComponent : IComponentData
4040
}
4141
```
4242

43-
Once you create this component, add it to the Cube Prefab. Then, in the Inspector, add the __Ghost Authoring Component__ to the Prefab. In this component, select __Update Component List__ to update the list of components.
43+
Once you create this component, add it to the Cube Prefab. Then, in the Inspector, add the __Ghost Authoring Component__ to the Prefab. In this component, select __Update Component List__ to update the list of components.
4444

45-
When you do this, Unity automatically adds default values to the Translation and Rotation components. Expand the components in the list to select where they should be present. In this example, disable `PerInstanceCullingTag` and `RenderMesh` on the server. This is because the server does not render anything, and interpolated objects on the client don’t simulate anything.
45+
When you do this, Unity automatically adds default values to the Translation and Rotation components. Expand the components in the list to select where they should be present. In this example, disable `PerInstanceCullingTag` and `RenderMesh` on the server. This is because the server does not render anything, and interpolated objects on the client don’t simulate anything.
4646

4747
![The Ghost Authoring component](images/ghost-config.png)<br/>_The Ghost Authoring component_
4848

49-
**Note:** Change the __Default Client Instantiation__ to __Owner Predicted__. This makes sure that you predict your own movement.
49+
**Note:** Change the __Default Client Instantiation__ to __Owner Predicted__. This makes sure that you predict your own movement.
5050

5151
After you set up the component, select the __Generate Code__ button.
5252

@@ -131,16 +131,18 @@ public struct GoInGameRequest : IRpcCommand
131131
RpcExecutor.ExecuteCreateRequestComponent<GoInGameRequest>(ref parameters);
132132
}
133133

134+
static PortableFunctionPointer<RpcExecutor.ExecuteDelegate> InvokeExecuteFunctionPointer =
135+
new PortableFunctionPointer<RpcExecutor.ExecuteDelegate>(InvokeExecute);
134136
public PortableFunctionPointer<RpcExecutor.ExecuteDelegate> CompileExecute()
135137
{
136-
return new PortableFunctionPointer<RpcExecutor.ExecuteDelegate>(InvokeExecute);
138+
return InvokeExecuteFunctionPointer;
137139
}
138140
}
139141
```
140142

141143
**Note:** Don’t forget the `BurstCompile` attribute on `InvokeExecute`.
142144

143-
To make sure NetCode handles the command, you need to create a [RpcCommandRequestSystem](https://docs.unity3d.com/Packages/com.unity.netcode@latest/index.html?subfolder=/api/Unity.NetCode.RpcCommandRequestSystem-1.html) as follows:
145+
To make sure NetCode handles the command, you need to create a [RpcCommandRequestSystem](https://docs.unity3d.com/Packages/com.unity.netcode@latest/index.html?subfolder=/api/Unity.NetCode.RpcCommandRequestSystem-1.html) as follows:
144146

145147
```c#
146148
// The system that makes the RPC request component transfer
@@ -313,10 +315,10 @@ public class GoInGameServerSystem : ComponentSystem
313315
var ghostId = NetCubeGhostSerializerCollection.FindGhostType<CubeSnapshotData>();
314316
var prefab = EntityManager.GetBuffer<GhostPrefabBuffer>(ghostCollection.serverPrefabs)[ghostId].Value;
315317
var player = EntityManager.Instantiate(prefab);
316-
318+
317319
EntityManager.SetComponentData(player, new MovableCubeComponent { PlayerId = EntityManager.GetComponentData<NetworkIdComponent>(reqSrc.SourceConnection).Value});
318320
PostUpdateCommands.AddBuffer<CubeInput>(player);
319-
321+
320322
PostUpdateCommands.SetComponent(reqSrc.SourceConnection, new CommandTargetComponent {targetEntity = player});
321323

322324
PostUpdateCommands.DestroyEntity(reqEnt);

Editor/CodeGenTemplates/GhostDeserializerCollection.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,29 +39,28 @@ public void BeginDeserialize(JobComponentSystem system)
3939
#endregion
4040
}
4141
public bool Deserialize(int serializer, Entity entity, uint snapshot, uint baseline, uint baseline2, uint baseline3,
42-
DataStreamReader reader,
43-
ref DataStreamReader.Context ctx, NetworkCompressionModel compressionModel)
42+
ref DataStreamReader reader, NetworkCompressionModel compressionModel)
4443
{
4544
switch (serializer)
4645
{
4746
#region __GHOST_INVOKE_DESERIALIZE__
4847
case __GHOST_SERIALIZER_INDEX__:
4948
return GhostReceiveSystem<__GHOST_COLLECTION_PREFIX__GhostDeserializerCollection>.InvokeDeserialize(m___GHOST_SNAPSHOT_TYPE__FromEntity, entity, snapshot, baseline, baseline2,
50-
baseline3, reader, ref ctx, compressionModel);
49+
baseline3, ref reader, compressionModel);
5150
#endregion
5251
default:
5352
throw new ArgumentException("Invalid serializer type");
5453
}
5554
}
56-
public void Spawn(int serializer, int ghostId, uint snapshot, DataStreamReader reader,
57-
ref DataStreamReader.Context ctx, NetworkCompressionModel compressionModel)
55+
public void Spawn(int serializer, int ghostId, uint snapshot, ref DataStreamReader reader,
56+
NetworkCompressionModel compressionModel)
5857
{
5958
switch (serializer)
6059
{
6160
#region __GHOST_INVOKE_SPAWN__
6261
case __GHOST_SERIALIZER_INDEX__:
6362
m___GHOST_SNAPSHOT_TYPE__NewGhostIds.Add(ghostId);
64-
m___GHOST_SNAPSHOT_TYPE__NewGhosts.Add(GhostReceiveSystem<__GHOST_COLLECTION_PREFIX__GhostDeserializerCollection>.InvokeSpawn<__GHOST_SNAPSHOT_TYPE__>(snapshot, reader, ref ctx, compressionModel));
63+
m___GHOST_SNAPSHOT_TYPE__NewGhosts.Add(GhostReceiveSystem<__GHOST_COLLECTION_PREFIX__GhostDeserializerCollection>.InvokeSpawn<__GHOST_SNAPSHOT_TYPE__>(snapshot, ref reader, compressionModel));
6564
break;
6665
#endregion
6766
default:

Editor/CodeGenTemplates/GhostSerializer.cs

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ public int CalculateImportance(ArchetypeChunk chunk)
2727
return __GHOST_IMPORTANCE__;
2828
}
2929

30-
public bool WantsPredictionDelta => true;
31-
3230
public int SnapshotSize => UnsafeUtility.SizeOf<__GHOST_NAME__SnapshotData>();
3331
public void BeginSerialize(ComponentSystemBase system)
3432
{
@@ -46,20 +44,6 @@ public void BeginSerialize(ComponentSystemBase system)
4644
#endregion
4745
}
4846

49-
public bool CanSerialize(EntityArchetype arch)
50-
{
51-
var components = arch.GetComponentTypes();
52-
int matches = 0;
53-
for (int i = 0; i < components.Length; ++i)
54-
{
55-
#region __GHOST_COMPONENT_TYPE_CHECK__
56-
if (components[i] == componentType__GHOST_COMPONENT_TYPE_NAME__)
57-
++matches;
58-
#endregion
59-
}
60-
return (matches == __GHOST_COMPONENT_COUNT__);
61-
}
62-
6347
public void CopyToSnapshot(ArchetypeChunk chunk, int ent, uint tick, ref __GHOST_NAME__SnapshotData snapshot, GhostSerializerState serializerState)
6448
{
6549
snapshot.tick = tick;

Editor/CodeGenTemplates/GhostSerializerCollection.cs

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,6 @@ public static int FindGhostType<T>()
3131
#endregion
3232
return -1;
3333
}
34-
public int FindSerializer(EntityArchetype arch)
35-
{
36-
#region __GHOST_FIND_CHECK__
37-
if (m___GHOST_SERIALIZER_TYPE__.CanSerialize(arch))
38-
return __GHOST_SERIALIZER_INDEX__;
39-
#endregion
40-
throw new ArgumentException("Invalid serializer type");
41-
}
4234

4335
public void BeginSerialize(ComponentSystemBase system)
4436
{
@@ -60,19 +52,6 @@ public int CalculateImportance(int serializer, ArchetypeChunk chunk)
6052
throw new ArgumentException("Invalid serializer type");
6153
}
6254

63-
public bool WantsPredictionDelta(int serializer)
64-
{
65-
switch (serializer)
66-
{
67-
#region __GHOST_WANTS_PREDICTION_DELTA__
68-
case __GHOST_SERIALIZER_INDEX__:
69-
return m___GHOST_SERIALIZER_TYPE__.WantsPredictionDelta;
70-
#endregion
71-
}
72-
73-
throw new ArgumentException("Invalid serializer type");
74-
}
75-
7655
public int GetSnapshotSize(int serializer)
7756
{
7857
switch (serializer)
@@ -86,14 +65,14 @@ public int GetSnapshotSize(int serializer)
8665
throw new ArgumentException("Invalid serializer type");
8766
}
8867

89-
public int Serialize(SerializeData data)
68+
public int Serialize(ref DataStreamWriter dataStream, SerializeData data)
9069
{
9170
switch (data.ghostType)
9271
{
9372
#region __GHOST_INVOKE_SERIALIZE__
9473
case __GHOST_SERIALIZER_INDEX__:
9574
{
96-
return GhostSendSystem<__GHOST_COLLECTION_PREFIX__GhostSerializerCollection>.InvokeSerialize<__GHOST_SERIALIZER_TYPE__, __GHOST_SNAPSHOT_TYPE__>(m___GHOST_SERIALIZER_TYPE__, data);
75+
return GhostSendSystem<__GHOST_COLLECTION_PREFIX__GhostSerializerCollection>.InvokeSerialize<__GHOST_SERIALIZER_TYPE__, __GHOST_SNAPSHOT_TYPE__>(m___GHOST_SERIALIZER_TYPE__, ref dataStream, data);
9776
}
9877
#endregion
9978
default:

Editor/CodeGenTemplates/GhostSnapshotData.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public void PredictDelta(uint tick, ref __GHOST_NAME__SnapshotData baseline1, re
2626
#endregion
2727
}
2828

29-
public void Serialize(int networkId, ref __GHOST_NAME__SnapshotData baseline, DataStreamWriter writer, NetworkCompressionModel compressionModel)
29+
public void Serialize(int networkId, ref __GHOST_NAME__SnapshotData baseline, ref DataStreamWriter writer, NetworkCompressionModel compressionModel)
3030
{
3131
#region __GHOST_CALCULATE_CHANGE_MASK__
3232
#endregion
@@ -59,15 +59,15 @@ public void Serialize(int networkId, ref __GHOST_NAME__SnapshotData baseline, Da
5959
#endregion
6060
}
6161

62-
public void Deserialize(uint tick, ref __GHOST_NAME__SnapshotData baseline, DataStreamReader reader, ref DataStreamReader.Context ctx,
62+
public void Deserialize(uint tick, ref __GHOST_NAME__SnapshotData baseline, ref DataStreamReader reader,
6363
NetworkCompressionModel compressionModel)
6464
{
6565
this.tick = tick;
6666
#region __GHOST_READ_CHANGE_MASK__
67-
changeMask__GHOST_MASK_BATCH__ = reader.ReadPackedUIntDelta(ref ctx, baseline.changeMask__GHOST_MASK_BATCH__, compressionModel);
67+
changeMask__GHOST_MASK_BATCH__ = reader.ReadPackedUIntDelta(baseline.changeMask__GHOST_MASK_BATCH__, compressionModel);
6868
#endregion
6969
#region __GHOST_READ_IS_PREDICTED__
70-
bool isPredicted = reader.ReadPackedUInt(ref ctx, compressionModel)!=0;
70+
bool isPredicted = reader.ReadPackedUInt(compressionModel)!=0;
7171
#endregion
7272
#region __GHOST_READ__
7373
#endregion

Editor/CodeGenTemplates/GhostUpdateSystem.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ protected override JobHandle SetPredictedGhostDefaults(NativeArray<__GHOST_NAME_
329329
{
330330
snapshots = snapshots,
331331
predictionMask = predictionMask,
332-
localPlayerId = m_PlayerGroup.ToComponentDataArray<NetworkIdComponent>(Allocator.TempJob, out playerHandle),
332+
localPlayerId = m_PlayerGroup.ToComponentDataArrayAsync<NetworkIdComponent>(Allocator.TempJob, out playerHandle),
333333
};
334334
return job.Schedule(predictionMask.Length, 8, JobHandle.CombineDependencies(playerHandle, inputDeps));
335335
}

Editor/CodeGenTemplates/SnapshotValue/GhostSnapshotValueBool.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public void PredictDelta(uint tick, ref GhostSnapshotData baseline1, ref GhostSn
3131
#endregion
3232
}
3333

34-
public void Serialize(int networkId, ref GhostSnapshotData baseline, DataStreamWriter writer, NetworkCompressionModel compressionModel)
34+
public void Serialize(int networkId, ref GhostSnapshotData baseline, ref DataStreamWriter writer, NetworkCompressionModel compressionModel)
3535
{
3636
#region __GHOST_CALCULATE_CHANGE_MASK_ZERO__
3737
changeMask__GHOST_MASK_BATCH__ = (__GHOST_FIELD_NAME__ != baseline.__GHOST_FIELD_NAME__) ? 1u : 0;
@@ -45,12 +45,12 @@ public void Serialize(int networkId, ref GhostSnapshotData baseline, DataStreamW
4545
#endregion
4646
}
4747

48-
public void Deserialize(uint tick, ref GhostSnapshotData baseline, DataStreamReader reader, ref DataStreamReader.Context ctx,
48+
public void Deserialize(uint tick, ref GhostSnapshotData baseline, ref DataStreamReader reader,
4949
NetworkCompressionModel compressionModel)
5050
{
5151
#region __GHOST_READ__
5252
if ((changeMask__GHOST_MASK_BATCH__ & (1 << __GHOST_MASK_INDEX__)) != 0)
53-
__GHOST_FIELD_NAME__ = reader.ReadPackedUIntDelta(ref ctx, baseline.__GHOST_FIELD_NAME__, compressionModel);
53+
__GHOST_FIELD_NAME__ = reader.ReadPackedUIntDelta(baseline.__GHOST_FIELD_NAME__, compressionModel);
5454
else
5555
__GHOST_FIELD_NAME__ = baseline.__GHOST_FIELD_NAME__;
5656
#endregion

Editor/CodeGenTemplates/SnapshotValue/GhostSnapshotValueEntity.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public void PredictDelta(uint tick, ref GhostSnapshotData baseline1, ref GhostSn
3939
#endregion
4040
}
4141

42-
public void Serialize(int networkId, ref GhostSnapshotData baseline, DataStreamWriter writer, NetworkCompressionModel compressionModel)
42+
public void Serialize(int networkId, ref GhostSnapshotData baseline, ref DataStreamWriter writer, NetworkCompressionModel compressionModel)
4343
{
4444
#region __GHOST_CALCULATE_CHANGE_MASK_ZERO__
4545
changeMask__GHOST_MASK_BATCH__ = (__GHOST_FIELD_NAME__ != baseline.__GHOST_FIELD_NAME__) ? 1u : 0;
@@ -53,12 +53,12 @@ public void Serialize(int networkId, ref GhostSnapshotData baseline, DataStreamW
5353
#endregion
5454
}
5555

56-
public void Deserialize(uint tick, ref GhostSnapshotData baseline, DataStreamReader reader, ref DataStreamReader.Context ctx,
56+
public void Deserialize(uint tick, ref GhostSnapshotData baseline, ref DataStreamReader reader,
5757
NetworkCompressionModel compressionModel)
5858
{
5959
#region __GHOST_READ__
6060
if ((changeMask__GHOST_MASK_BATCH__ & (1 << __GHOST_MASK_INDEX__)) != 0)
61-
__GHOST_FIELD_NAME__ = reader.ReadPackedIntDelta(ref ctx, baseline.__GHOST_FIELD_NAME__, compressionModel);
61+
__GHOST_FIELD_NAME__ = reader.ReadPackedIntDelta(baseline.__GHOST_FIELD_NAME__, compressionModel);
6262
else
6363
__GHOST_FIELD_NAME__ = baseline.__GHOST_FIELD_NAME__;
6464
#endregion

Editor/CodeGenTemplates/SnapshotValue/GhostSnapshotValueFloat.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public void PredictDelta(uint tick, ref GhostSnapshotData baseline1, ref GhostSn
3131
#endregion
3232
}
3333

34-
public void Serialize(int networkId, ref GhostSnapshotData baseline, DataStreamWriter writer, NetworkCompressionModel compressionModel)
34+
public void Serialize(int networkId, ref GhostSnapshotData baseline, ref DataStreamWriter writer, NetworkCompressionModel compressionModel)
3535
{
3636
#region __GHOST_CALCULATE_CHANGE_MASK_ZERO__
3737
changeMask__GHOST_MASK_BATCH__ = (__GHOST_FIELD_NAME__ != baseline.__GHOST_FIELD_NAME__) ? 1u : 0;
@@ -45,12 +45,12 @@ public void Serialize(int networkId, ref GhostSnapshotData baseline, DataStreamW
4545
#endregion
4646
}
4747

48-
public void Deserialize(uint tick, ref GhostSnapshotData baseline, DataStreamReader reader, ref DataStreamReader.Context ctx,
48+
public void Deserialize(uint tick, ref GhostSnapshotData baseline, ref DataStreamReader reader,
4949
NetworkCompressionModel compressionModel)
5050
{
5151
#region __GHOST_READ__
5252
if ((changeMask__GHOST_MASK_BATCH__ & (1 << __GHOST_MASK_INDEX__)) != 0)
53-
__GHOST_FIELD_NAME__ = reader.ReadPackedIntDelta(ref ctx, baseline.__GHOST_FIELD_NAME__, compressionModel);
53+
__GHOST_FIELD_NAME__ = reader.ReadPackedIntDelta(baseline.__GHOST_FIELD_NAME__, compressionModel);
5454
else
5555
__GHOST_FIELD_NAME__ = baseline.__GHOST_FIELD_NAME__;
5656
#endregion

0 commit comments

Comments
 (0)