Expand description
§bevy_roll_safe
Rollback-safe implementations and utilities for Bevy Engine.
§Motivation
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.
§Roadmap
-
States
- Basic freely mutable states
-
OnEnter/OnLeave/OnTransition
- FrameCount
- Rollback-safe “Main”/default schedules
-
Audio playback
-
Support all
PlaybackModes - Support for seeking in “time-critical” audio
- Support for formats that don’t report sound durations (mp3/ogg)
-
Support all
- Events
§States
Bevy states when added through app.init_state::<FooState>() have two big problems:
- They happen in the
StateTransitionschedule 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).
If you are using the rollback schedule plugin as well. Adding a rollback safe state is a simple as app.init_roll_state::<YourState>().
See the states example for usage with bevy_ggrs.
§Default rollback schedule
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.
§Rollback audio
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.
§Cargo features
audio: Enable rollback-safe wrapper forbevy_audiobevy_ggrs: Enable integration withbevy_ggrsmath_determinism: Enable cross-platform determinism for operations on Bevy’s (glam) math types.
§Bevy Version Support
| bevy | bevy_roll_safe |
|---|---|
| 0.17 | 0.6, main |
| 0.16 | 0.5 |
| 0.15 | 0.4 |
| 0.14 | 0.3 |
| 0.13 | 0.2 |
| 0.12 | 0.1 |
§License
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.
§Contributions
PRs welcome!
Modules§
Structs§
- Initial
State Entered - Roll
Frame Count - Replacement for Bevy’s FrameCount, not tied to rendering
- Rollback
Audio Player - Rollback-safe wrapper around
AudioPlayer. - Rollback
Audio Player Instance - Represents an instance of a rollback sound effect that is currently playing
- Rollback
Audio Plugin - Plugin for managing rollback audio effects in a Bevy application.
- Rollback
Post Update - The schedule that contains logic that must run after
RollbackUpdate. - Rollback
PreUpdate - The schedule that contains logic that must run before
RollbackUpdate. For example, a system that reads raw keyboard input OS events into anEventsresource. This enables systems inRollbackUpdateto consume the events from theEventsresource without actually knowing about (or taking a direct scheduler dependency on) the “os-level keyboard event system”. - Rollback
Schedule Plugin - Rollback
State Transition - Runs rollback-safe state transitions
- Rollback
Update - The schedule that contains most gameplay logic
Traits§
Functions§
- apply_
state_ transition - If a new state is queued in
NextState<S>, this system: - increase_
frame_ count - remove_
finished_ sounds - run_
enter_ schedule - Run the enter schedule (if it exists) for the current state.
- start_
rollback_ sounds - Starts the rollback sounds by recording the current time as the start time
- sync_
rollback_ sounds - Updates playing sounds to match the desired state spawns any missing sounds that should be playing. and despawns any sounds that should not be playing.