#interpolation #bevy-networking #snapshot #prediction #bevy #bevy-plugin #networking

bevy_replicon_snap

High-level networking crate that extends the bevy_replicon crate to allow snapshot interpolation and client-side prediction

2 releases

0.2.1 Mar 24, 2024
0.2.0 Mar 9, 2024

#336 in Game dev

Download history 104/week @ 2024-03-04 38/week @ 2024-03-11 108/week @ 2024-03-18 44/week @ 2024-03-25 58/week @ 2024-04-01

212 downloads per month

MIT license

33KB
276 lines

CI crates.io

bevy_replicon_snap

A Snapshot Interpolation plugin for the networking solution bevy_replicon in the Bevy game engine.

This library is a very rough proof of concept and not meant to be used in productive games

Features

  • Basic but customizable snapshot interpolation for replicated components
  • Client-Side prediction:
    • Owner predicted: Owner client of the entity predicts, other clients interpolate

In the examples you can find a clone of the Simple Box example of bevy_replicon, in 3 versions: no interpolation or prediction, interpolated, predicted. I recommend to look at the diffs between those examples to gain a better understanding how this plugin works.

Usage

Setup

Add the bevy_replicon plugin and this plugin to your bevy application.

The plugin needs to know the maximum server tick rate to estimate time between snapshots so it needs to be passed in on initialization:

const MAX_TICK_RATE: u16 = 30;

...

.add_plugins((
    DefaultPlugins,
    RepliconPlugins.build().set(ServerPlugin {
        tick_policy: TickPolicy::MaxTickRate(MAX_TICK_RATE),
        ..default()
    }),
    RepliconRenetPlugins,
    SnapshotInterpolationPlugin {
        max_tick_rate: MAX_TICK_RATE,
    },
))

...

Interpolation

To allow a Component to be interpolated it needs to implement the traits: Interpolate, Serialze and Deserialize.

This lib provides a basic derive macro for Interpolate but for complex types you will have to implement it yourself.

use bevy_replicon_snap_macros::{Interpolate};

#[derive(Component, Deserialize, Serialize, Interpolate, Clone)] 
struct PlayerPosition(Vec2);

Next you need to register the component for Interpolation:

app.replicate_interpolated::<PlayerPosition>()

this also registers the component for replication by bevy_replicon.

Last Step is to add the Interpolated Component to any entity that should be interpolated.

commands.spawn((
    PlayerPosition(Vec2::ZERO),
    Replication,
    Interpolated,
    ...
));

Client-Side Prediction

Coming soon.. In the meantime check the "predicted" example!

Alternatives

  • bevy_timewarp An awesome predict/rollback library that also has integration with bevy_replicon

Dependencies

~22–60MB
~1M SLoC