Rollback-safe implementations and utilities for Bevy Engine.
Some of Bevy's features can't be used in a rollback context (with crates such as bevy_ggrs
). This is either because they behave non-deterministically, rely on inaccessible local system state, or are tightly coupled to the Main
schedule.
- States
- Basic freely mutable states
-
OnEnter
/OnLeave
/OnTransition
- Sub-States
- Computed states
- Roll-safe state events
- FrameCount
- Rollback-safe "Main"/default schedules
- Audio playback
- Support all
PlaybackMode
s - Support for seeking in "time-critical" audio
- Support for formats that don't report sound durations (mp3/ogg)
- Support all
- Events
Bevy states when added through app.init_state::<FooState>()
have two big problems:
- They happen in the
StateTransition
schedule within theMainSchedule
- If rolled back to the first frame,
OnEnter(InitialState)
is not re-run.
This crate provides an extension method, init_roll_state_in_schedule::<S>(schedule)
, which lets you add a state to the schedule you want, and a resource, InitialStateEntered<S>
which can be rolled back and tracks whether the initial OnEnter
should be run (or re-run on rollbacks to the initial frame).
See the states
example for usage with bevy_ggrs
.
RollbackSchedulePlugin
adds rollback-specific alternatives to the schedules in Bevy's FixedMain
/Main
schedules.
The plugin takes a parent schedule as input, so it can easily be added to the ggrs schedule or any other schedule you want.
RollbackAudioPlugin
lets you easily play sound effects from a rollback world without duplicate sounds playing over each other. It depends on the RollbackSchedulePlugin
, or you need to add the maintenance system in a similar order to your own schedules.
audio
: Enable rollback-safe wrapper forbevy_audio
bevy_ggrs
: Enable integration withbevy_ggrs
math_determinism
: Enable cross-platform determinism for operations on Bevy's (glam
) math types.
bevy | bevy_roll_safe |
---|---|
0.16 | 0.5, main |
0.15 | 0.4 |
0.14 | 0.3 |
0.13 | 0.2 |
0.12 | 0.1 |
bevy_roll_safe
is dual-licensed under either
- MIT License (./LICENSE-MIT or http://opensource.org/licenses/MIT)
- Apache License, Version 2.0 (./LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
at your option.
PRs welcome!