Currently the rollback of adding and changing entities should be stable. If you spawn or navigate entities in multiple game-instances, all simulations will end up in a synced state, no matter how many packets drop or how high the lag is. Clientside prediction makes sure that local commands are executed under any condition.
- Open Server.LiteNetLib/Server.LiteNetLib.sln
- Run Server-project (Console), enter "1" when asked for room-size
- Open SampleScene in Unity
- Hit play and wait until connection to server is established
- Holding right mouse button will continously spawn new agents, press 'X' to navigate all agents to your current mouse position
- Build and run the Unityproject
- Start the server. The roomsize will default to 2 after a few seconds of no input
- Hit play in Unity so you should now have two instances of the game running
- Wait until both players are connected to the server. The server will display a message when the simulation has started.
- For controls, same as above
- Synchronizing framerate. If a client lags too much or lag compensation is too low, the delayed input will force every other client to constantly rollback the simulation. The project requires a solution to minimize the need of rollback for every client.
- Performance spikes are currently by design. In case of an input from the very past, a rollback of many (speak: thousands of) ticks at once occur. Adding constraints like max. input-offset and adjusting framerates for slow clients will help improving everyones performance. The target-frame for rollback is also not optimized, this can save lots of performance too.
- Rollback for despawned (e.g. killed) entities is not implemented yet, it will arrive after navigation, combat/projectiles and health is working.
- The ECS-Project currently targets .NET Framework 4.6.1 (#806)
- The server targets .NET Core Framework 2.2.103 (link to setup)
Inspired by LockstepFramework, in memory of SnpM: https://github.com/SnpM/LockstepFramework
Uses a fork of BEPUPhysics for deterministic physics: https://github.com/sam-vdp/bepuphysics1int
Uses FixedMath.Net for deterministic fp-calculations: https://github.com/asik/FixedMath.Net
Uses Entitas as ECS Framework: https://github.com/sschmid/Entitas-CSharp
The project includes an implementation example using LiteNetLib: https://github.com/RevenantX/LiteNetLib
Initial commit was targeting the following protocol: https://www.reddit.com/r/Unity3D/comments/aewepu/rts_networking_simulate_on_serverbeat/. The project has shifted to an architecture you see above.
- Physics values are limited to 1000 so keep your world in these limitations or shift the world when your values become too large