Tweening animation plugin for the Bevy game engine.

Overview

🍃 Bevy Tweening

License: MIT/Apache Doc Crate Build Status Coverage Status Bevy tracking

Tweening animation plugin for the Bevy game engine.

Features

  • Animate any field of any component or asset, including custom ones.
  • Run multiple tweens (animations) per component/asset in parallel.
  • Chain multiple tweens (animations) one after the other for complex animations.
  • Raise a Bevy event or invoke a callback when an tween completed.

Usage

Dependency

Add to Cargo.toml:

[dependencies]
bevy_tweening = "0.4"

This crate supports the following features:

Feature Default Description
bevy_sprite Yes Includes built-in lenses for some Sprite-related components.
bevy_ui Yes Includes built-in lenses for some UI-related components.

System setup

Add the TweeningPlugin to your app:

App::default()
    .add_plugins(DefaultPlugins)
    .add_plugin(TweeningPlugin)
    .run();

Animate a component

Animate the transform position of an entity by creating a Tween animation for the tranform, and adding an Animator component with that tween:

// Create a single animation (tween) to move an entity.
let tween = Tween::new(
    // Use a quadratic easing on both endpoints.
    EaseFunction::QuadraticInOut,
    // Loop animation back and forth.
    TweeningType::PingPong,
    // Animation time (one way only; for ping-pong it takes 2 seconds
    // to come back to start).
    Duration::from_secs(1),
    // The lens gives the Animator access to the Transform component,
    // to animate it. It also contains the start and end values associated
    // with the animation ratios 0. and 1.
    TransformPositionLens {
        start: Vec3::new(0., 0., 0.),
        end: Vec3::new(1., 2., -4.),
    },
);

commands
    // Spawn a Sprite entity to animate the position of.
    .spawn_bundle(SpriteBundle {
        sprite: Sprite {
            color: Color::RED,
            custom_size: Some(Vec2::new(size, size)),
            ..Default::default()
        },
        ..Default::default()
    })
    // Add an Animator component to control and execute the animation.
    .insert(Animator::new(tween));
}

Chaining animations

Bevy Tweening supports several types of tweenables, building blocks that can be combined to form complex animations. A tweenable is a type implementing the Tweenable<T> trait.

  • Tween - A simple tween (easing) animation between two values.
  • Sequence - A series of tweenables executing in series, one after the other.
  • Tracks - A collection of tweenables executing in parallel.
  • Delay - A time delay.

Most tweenables can be chained with the then() operator:

// Produce a sequence executing 'tween1' then 'tween2'
let tween1 = Tween { [...] }
let tween2 = Tween { [...] }
let seq = tween1.then(tween2);

Predefined Lenses

A small number of predefined lenses are available for the most common use cases, which also serve as examples. Users are encouraged to write their own lens to tailor the animation to their use case.

The naming scheme for predefined lenses is "<TargetName><FieldName>Lens", where <TargetName> is the name of the target Bevy component or asset type which is queried by the internal animation system to be modified, and <FieldName> is the field which is mutated in place by the lens. All predefined lenses modify a single field. Custom lenses can be written which modify multiple fields at once.

Bevy Components

Target Component Animated Field Lens Feature
Transform translation TransformPositionLens
rotation (Quat TransformRotationLens
rotation (angle)² TransformRotateXLens
rotation (angle)² TransformRotateYLens
rotation (angle)² TransformRotateZLens
rotation (angle)² TransformRotateAxisLens
scale TransformScaleLens
Sprite color SpriteColorLens bevy_sprite
Style position UiPositionLens bevy_ui
Text TextStyle::color TextColorLens bevy_ui

¹ Shortest-path interpolation between two rotations, using Quat::slerp().

² Angle-based interpolation, valid for rotations over ½ turn.

See the comparison of rotation lenses for details.

Bevy Assets

Target Asset Animated Field Lens Feature
ColorMaterial color ColorMaterialColorLens bevy_sprite

Custom lens

A custom lens allows animating any field or group of fields of a Bevy component or asset. A custom lens is a type implementing the Lens trait, which is generic over the type of component or asset.

struct MyXAxisLens {
    start: f32,
    end: f32,
}

impl Lens<Tranform> for MyXAxisLens {
    fn lerp(&self, target: &mut Tranform, ratio: f32) -> f32 {
        let start = Vec3::new(self.start, 0., 0.);
        let end = Vec3::new(self.end, 0., 0.);
        target.translation = start + (end - start) * ratio;
    }
}

Note that the lens always linearly interpolates the field(s) of the component or asset. The type of easing applied modifies the rate at which the ratio parameter evolves, and is applied before the lerp() function is invoked.

The basic formula for lerp (linear interpolation) is either of:

  • start + (end - start) * scalar
  • start * (1.0 - scalar) + end * scalar

The two formulations are mathematically equivalent, but one may be more suited than the other depending on the type interpolated and the operations available, and the potential floating-point precision errors.

Custom component support

Custom components are animated like built-in Bevy ones, via a lens.

#[derive(Component)]
struct MyCustomComponent(f32);

struct MyCustomLens {
    start: f32,
    end: f32,
}

impl Lens<MyCustomComponent> for MyCustomLens {
    fn lerp(&self, target: &mut MyCustomComponent, ratio: f32) -> f32 {
        target.0 = self.start + (self.end - self.start) * ratio;
    }
}

Then, in addition, the system component_animator_system::<CustomComponent> needs to be added to the application. This system will extract each frame all CustomComponent instances with an Animator<CustomComponent> on the same entity, and animate the component via its animator.

Custom asset support

The process is similar to custom components, creating a custom lens for the custom asset. The system to add is asset_animator_system::<CustomAsset>.

Examples

See the examples/ folder.

menu

cargo run --example menu --features="bevy/bevy_winit"

menu

sprite_color

cargo run --example sprite_color --features="bevy/bevy_winit"

sprite_color

transform_rotation

cargo run --example transform_rotation --features="bevy/bevy_winit"

sprite_color

transform_translation

cargo run --example transform_translation --features="bevy/bevy_winit"

sprite_color

colormaterial_color

cargo run --example colormaterial_color --features="bevy/bevy_winit"

colormaterial_color

ui_position

cargo run --example ui_position --features="bevy/bevy_winit"

ui_position

sequence

cargo run --example sequence --features="bevy/bevy_winit"

sequence

Ease Functions

Many ease functions are available:

  • QuadraticIn
  • QuadraticOut
  • QuadraticInOut
  • CubicIn
  • CubicOut
  • CubicInOut
  • QuarticIn
  • QuarticOut
  • QuarticInOut
  • QuinticIn
  • QuinticOut
  • QuinticInOut
  • SineIn
  • SineOut
  • SineInOut
  • CircularIn
  • CircularOut
  • CircularInOut
  • ExponentialIn
  • ExponentialOut
  • ExponentialInOut
  • ElasticIn
  • ElasticOut
  • ElasticInOut
  • BackIn
  • BackOut
  • BackInOut
  • BounceIn
  • BounceOut
  • BounceInOut

Compatible Bevy versions

The main branch is compatible with the latest Bevy release.

Compatibility of bevy_tweening versions:

bevy_tweening bevy
0.4 0.7
0.2-0.3 0.6
0.1 0.5

Due to the fast-moving nature of Bevy and frequent breaking changes, and the limited resources to maintan 🍃 Bevy Tweening, the main (unreleased) Bevy branch is not supported.

Comparison with bevy_easings

The bevy_tweening library started as a fork of the bevy_easings library by François Mocker, with the goals to:

  • explore an alternative design based on lenses instead of generic types for each easer/animator. This reduces both the number of generic types needed, and hopefully the code size, as well as the number of systems needed to perform the interpolation.
  • improve the interpolation of assets to avoid creating many copies like bevy_easings does, and instead mutate the assets (and, by similarity, the components too) in-place without making a copy. The in-place mutation also allows a more optimal interpolation limited to modifying the fields of interest only, instead of creating a new copy of the entire component each tick.
Comments
  • Support running an animation N times

    Support running an animation N times

    Fixes #17

    This supports an animation like the following:

    pub fn error_shake(current: &Transform) -> Sequence<Transform> {
        let wiggle = Quat::from_rotation_z(PI / 16.);
        Tween::new(
            EaseMethod::Linear,
            TweeningType::Once,
            Duration::from_millis(25),
            TransformRotationLens {
                start: current.rotation,
                end: current.rotation * wiggle.inverse(),
            },
        )
        .then(Tween::new(
            EaseMethod::Linear,
            TweeningType::PingPongTimes(3),
            Duration::from_millis(50),
            TransformRotationLens {
                start: current.rotation * wiggle.inverse(),
                end: current.rotation * wiggle,
            },
        ))
        .then(Tween::new(
            EaseMethod::Linear,
            TweeningType::Once,
            Duration::from_millis(25),
            TransformRotationLens {
                start: current.rotation * wiggle,
                end: current.rotation,
            },
        ))
    }
    
    enhancement 
    opened by SUPERCILEX 10
  • Circle rotation results in invisible entity

    Circle rotation results in invisible entity

    Here is the code:

    use bevy::prelude::*;
    use bevy_tweening::{lens::*, *};
    
    fn main() {
        App::default()
            .add_plugins(DefaultPlugins)
            .add_plugin(TweeningPlugin)
            .add_startup_system(setup)
            .run();
    }
    
    fn setup(mut commands: Commands) {
        commands.spawn_bundle(OrthographicCameraBundle::new_2d());
    
        let size = 80.;
        let tween = Tween::new(
            EaseMethod::Linear,
            TweeningType::PingPong,
            std::time::Duration::from_secs(1),
            TransformRotationLens {
                start: Quat::IDENTITY,
                end: Quat::from_axis_angle(Vec3::Z, std::f32::consts::PI),
            },
        );
    
        commands
            .spawn_bundle((
                Transform::default(),
                GlobalTransform::default(),
            ))
            .with_children(|parent| {
                parent
                    .spawn_bundle(SpriteBundle {
                        sprite: Sprite {
                            color: Color::RED,
                            custom_size: Some(Vec2::new(size, size * 0.5)),
                            ..Default::default()
                        },
                        ..Default::default()
                    })
                    .insert(Animator::new(tween));
            });
    }
    

    It works correctly, sprite rotates. But if you replace std::f32::consts::PI with std::f32::consts::TAU the sprite becomes invisible.

    external-bug 
    opened by Shatur 10
  • ColorMaterialColorLens bug

    ColorMaterialColorLens bug

    bevy::prelude::ColorMaterial does not implementbevy::prelude::Component, which breaks ColorMaterialColorLens.

    Full error message:

    error[E0277]: the trait bound bevy::prelude::ColorMaterial: bevy::prelude::Component is not satisfied --> src\main.rs:265:44 | 265 | commands.entity(e2).insert(Animator::new(Tween::new( | ^^^^^^^^ the trait bevy::prelude::Component is not implemented for bevy::prelude::ColorMaterial | = help: the following other types implement trait bevy::prelude::Component: AdditionalMassProperties AlphaMode AnimationPlayer Animator AssetAnimator BackgroundColor Ball BloomSettings and 120 others note: required by a bound in Animator --> {DIRECTORY}\bevy_tweening-0.6.0\src\lib.rs:408:24 | 408 | pub struct Animator<T: Component> { | ^^^^^^^^^ required by this bound in Animator

    invalid 
    opened by IvoteSligte 7
  • Optimize out allocations as much as possible

    Optimize out allocations as much as possible

    Current paint points:

    • All tweenables in sequences and tracks are allocated even though most people will primarily use the built-ins.
    • There's double boxing causing extreme indirection: tweenables are stored in a vec which contains boxes of boxes (since IntoBoxDynTweenable unconditionally boxes and there's no way to avoid this without specialization which is a long ways away).
    • Creating seqs/tracks of heterogeneous types is very ugly and confusing.

    Solutions:

    • Use an enum to fake dynamic typing for built-ins.
    • Provide an impl for boxed types for 3P tweenables.
    • Export a BoxedTweenable type to alleviate typing pain.

    This makes built-ins zero cost while 3P types only suffer one layer of indirection.

    Closes #28

    bug enhancement 
    opened by SUPERCILEX 7
  • Update to bevy 0.8

    Update to bevy 0.8

    bevy 0.8 has just been released and I would love to use bevy_tweening with it. I've successfully been using these changes with a local copy. bevy-inspector-egui does not have a compatible release yet, unfortunately.

    enhancement 
    opened by outergod 6
  • Custom lens not working

    Custom lens not working

    Hi, i was trying to implement simple custom lens for animating my ui image alpha, but it doesn't work, am i doing something wrong ?

    struct ImageOpacityLens {
        start: f32,
        end: f32,
    }
    
    impl Lens<BackgroundColor> for ImageOpacityLens {
        fn lerp(&mut self, target: &mut BackgroundColor, ratio: f32) {
            let interpolated_value = self.start + (self.end - self.start) * ratio;
            target.0.set_a(interpolated_value);
        }
    }
    
    let tween = Tween::new(
            EaseFunction::QuadraticInOut,
            Duration::from_secs(2),
            ImageOpacityLens {
                start: 0.0,
                end: 1.0,
            },
        )
        .with_repeat_count(RepeatCount::Finite(2))
        .with_repeat_strategy(RepeatStrategy::MirroredRepeat);
    
    commands.spawn((
            ImageBundle {
                style: Style {
                    margin: UiRect::all(Val::Auto),
                    size: Size::new(Val::Px(300.0), Val::Auto),
                    ..default()
                },
                image: UiImage(icon),
                ..default()
            },
            Animator::new(tween),
        ));
    
    opened by Cataykus 4
  • Translation values still being changed after Animation played

    Translation values still being changed after Animation played "Once" finished

    Whenever I use the TransformPositionLens with TweeningType::Once, even after the animation is completed, the entitities transform seems to be "changed" still. I know this because I have another system listening on transform Change and it is triggering every frame.

    #[derive(Component)]
    pub struct ImTweeningHere;
    
    pub fn move_player_on_click(
        mut commands: Commands,
        mouse_input: Res<Input<MouseButton>>,
        grid_dimensions: Res<GridDimensions>,
        mouse_map_pos: Option<Res<MouseMapPos>>,
        player: Query<(Entity, &Transform), (With<Player>, Without<ImTweeningHere>)>,
    ) {
        if let (true, Some(mouse_map_pos)) = (
            mouse_input.just_pressed(MouseButton::Left),
            mouse_map_pos.as_deref(),
        ) {
            if let Ok((entity, player_transform)) = player.get_single() {
                let end_position = grid_dimensions.grid_loc_to_vec2(
                    (mouse_map_pos.0.x / grid_dimensions.tile_area).floor(),
                    (mouse_map_pos.0.y / grid_dimensions.tile_area).floor(),
                );
    
                let tween = Tween::new(
                    EaseFunction::CircularInOut,
                    TweeningType::Once,
                    std::time::Duration::from_millis(500),
                    TransformPositionLens {
                        start: player_transform.translation,
                        end: Transform::from_translation(end_position.extend(player_transform.translation.z))
                            .translation,
                    },
                )
                .with_completed_event(true, 0);
    
                let animator = Animator::new(tween);
                commands
                    .entity(entity)
                    .insert(animator)
                    .insert(ImTweeningHere);
            }
        }
    }
    

    the above system triggers the animation on map click, when the animation completes, the entities Transform still fires off

    fn player_transforming(
        player: Query<&Transform, (With<Player>, Changed<Transform>)>,
    ) {
        if let Ok(transforming) = player.get_single() {
            info!("player is transforming!: {transforming:?}");
        }
    }
    

    as a work around, I manually remove the AnimatorTransform on tween complete

    fn movement_completed(mut commands: Commands, mut on_tween_complete: EventReader<TweenCompleted>) {
        for evt in on_tween_complete.iter() {
            if evt.user_data == 0 {
                commands
                    .entity(evt.entity)
                    .remove::<ImTweeningHere>()
                    .remove::<Animator<Transform>>();
            }
        }
    }
    

    However, I am not sure if this is the intended behavior. do we need to remove the Animator on animation complete. I expect that the intended behavior when using a TweeningType of Once is the component will be removed on animation complete for the entity and we use the TweenCompleted event for other stuff, like my use case here to remove my own component.

    bug bevy-blocked 
    opened by jakyle 4
  • Support Bevy 0.9

    Support Bevy 0.9

    Admitted – this issue is not very original, but it does not hurt to have it filed: Bevy 0.9 has just been released, and there is a migration guide at https://bevyengine.org/learn/book/migration-guides/0.8-0.9/

    I am still inexperienced with rust and cargo and run into the most basic of problems: bevy_tweening 0.5.0 still depends on bevy 0.8.1, and I am getting compilation errors related to mismatching dependency versions.

    opened by hmeine 3
  • [Support?] How to animate complex shapes involving modifying a path, position, and rotation with multiple steps?

    [Support?] How to animate complex shapes involving modifying a path, position, and rotation with multiple steps?

    Hey,

    I want to create a turtlegraphics clone in bevy. So far I achieved the basic functionality:

    https://user-images.githubusercontent.com/290005/186853826-97c6a175-39a0-4dfc-8357-e08811e18a8a.mp4

    I did so by one line/circle etc each being one bundle with an animator...

    Now I would like to make this form filled: like here https://github.com/sunjay/turtle/blob/master/docs/assets/images/examples/ferris.gif

    But to fill that all the lines need to be in one bundle I think. Of course I could create a rather complicated lens that draws that bundle but the lerping would break because all the steps in the middle would be faster than at the beginning or the end...

    I'm not sure if I found all the relevant documentation so I might miss something obvious. However I'd very much appreciate some hints on how such a thing could be achieved.

    Thank you!

    opened by enaut 3
  • Investigate providing `&mut world` in tweenable callback vs. using events

    Investigate providing `&mut world` in tweenable callback vs. using events

    Currently a tweenable callback has little information. It contains a reference to the Tween<T>, and (change not merged yet) the Entity of the Animator<T> or AssetAnimator<T>.

    Kero on Discord suggested providing a &mut world to allow the callback to do something useful, similar to what bevy-tick-timers does. But this forces the system ticking the animators to take a global lock and become exclusive, serializing execution and being a potential choke point for other Bevy systems, which can cause performance issues. This is particularly bad for bevy_tweening which has a series of such systems, once per component type:

    https://github.com/djeedai/bevy_tweening/blob/38e99394749d834f5afd7e5bf76b4692b7d44ce1/src/plugin.rs#L48-L59

    A possible alternative which sounds more Bevy-esque would be to replace the callback with a Bevy event. This way the user app can design any system they want to read that event, with any resource / query they need. This however implies being able to write an event without knowing its type at build time, to avoid depending on the event type as an extra generic parameter for the system:

    let mut tween = Tween::new(...);
    tween.set_completed::<MyEvent>();
    

    then

    pub fn component_animator_system<T: Component>( 
        time: Res<Time>, 
        mut query: Query<(&mut T, &mut Animator<T>)>,
        mut writer: EventWriter<????>, //< Here we don't know the type
    ) { 
        for (ref mut target, ref mut animator) in query.iter_mut() { 
            if animator.state != AnimatorState::Paused { 
                if let Some(tweenable) = animator.tweenable_mut() { 
                    tweenable.tick(time.delta(), target, writer); 
                } 
            } 
        } 
    } 
    
    enhancement 
    opened by djeedai 3
  • How to tween both translation and scale of Transform simultaneously?

    How to tween both translation and scale of Transform simultaneously?

    This was pretty easy to do with the old bevy_easings crate, that this crate was based on, because it dealt with the entire Transform all at once.

    Here, you are providing separate "lenses" for translation, rotation, and scale, and all of them set the generic parameter on Lens<T> to T: Transform, meaning that I cannot add multiple to the same entity simultaneously. There is no lens for working with the whole transform. :(

    So have you made it impossible to tween between two Transforms? Only leaving the possibility to operate on one field at a time?

    question 
    opened by inodentry 2
  • Sequence with repeat_count

    Sequence with repeat_count

    Hey,

    I was trying to have an object zoom into existence then wiggle infinitely... I tried doing that with:

    Tween::new(
                EaseFunction::QuadraticInOut,
                Duration::from_millis(1000),
                TransformScaleLens {
                    start: Vec3::ZERO,
                    end: Vec3::ONE,
                },
            )
            .then(
                Tween::new(
                    EaseFunction::QuadraticInOut,
                    Duration::from_millis(200),
                    TransformRotateZLens {
                        start: 0.05,
                        end: -0.05,
                    },
                )
                .with_repeat_strategy(bevy_tweening::RepeatStrategy::MirroredRepeat)
                .with_repeat_count(RepeatCount::Infinite),
            )
    

    But when Running the first animation works well, however the second one panics with:

    thread 'Compute Task Pool (13)' panicked at 'overflow when subtracting durations', library/core/src/time.rs:930:9
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    

    The same happens if repeat_count is set to a finite number even when set to 1.

    It might be that this is "known" or "intended" but if so it should probably be in the documentation for the then method or the Sequence type.

    The Behaviour I expected would have been an infinite sequence first the zoom then forever wiggling...

    opened by enaut 1
  • Completion events on all Tweenables

    Completion events on all Tweenables

    set_completed_event/with_completed_event are currently only available on the Tween type. It'd be nice to have them on any Tweenable, but especially on the compound ones: Sequence and Tracks.

    My current workaround for this is to attach the completion to the last tweenable in sequence. This is pretty awkward, because you have to do it before you type-erase it, e.g.:

    // `transitions` is Vec<(Duration, /* target alpha */ f32)>
    let mut sequence: Vec<BoxedTweenable<Sprite>> = Vec::with_capacity(transitions.len());
    
    let mut current_alpha = initial;
    for (i, &(duration, end_alpha)) in transitions.iter().enumerate() {
        if (end_alpha - current_alpha).abs() < 0.01 {
            sequence.push(Box::new(Delay::new(duration)));
        } else {
            let lens = SpriteColorLens {
                start: fade_sprite_color(current_alpha),
                end: fade_sprite_color(end_alpha),
            };
    
            let mut tween = Tween::new(EaseMethod::Linear, TweeningType::Once, duration, lens);
            if i == transitions.len() - 1 {
                tween.set_completed_event(TWEEN_COMPLETION_COOKIE);
            }
    
            sequence.push(Box::new(tween));
        }
        current_alpha = end_alpha;
    }
    
    Sequence::new(sequence)
    

    This also doesn't work if the last tweenable is Delay. For that case, you need to turn your Sequence into Tracks, with a parallel Tween that does nothing but provide the completion event. This might require a custom NoopLens<T: Component> type.

    All in all, pretty messy. Having set_completed_event on more tweenable types would eliminate the need for tricks like this.

    enhancement 
    opened by Xion 1
  • Add speed test ticking a tween

    Add speed test ticking a tween

    Add an animator speed test which actually ticks a tween. Currently because the ticking is deferred to the tween itself, and applied "manually" by the built-in animator systems, it's easy to break the feature without noticing as the systems are also not tested.

    testing 
    opened by djeedai 0
  • Design what happens to completion events when playback jumps backward

    Design what happens to completion events when playback jumps backward

    The set_progress() (and discussed set_elapsed()) method allow you to move the animation to an earlier point than the one it's in currently. Traditionally for tick-based animation the tween will emit a completion event each time it's completed. However, when playback jumps backward, it's unclear what should be done for completion events, especially when the tween is repeating, and jumping backward can decrease the completed count (times_completed) by more than one.

    Conceptually it feels like jumping backward this way is not a natural way of animating, and is more geared toward editors or manual seeking, so it feels like ignoring completion events (and callbacks) in that case is the best approach.

    Note however that there is also the playback direction which allows smooth playback but in reverse order. Although this is a distinct and probably orthogonal feature (it only swaps the endpoints of the lens), conceptually it can be confusing to make a distinction between "moving by 1 second in backward direction" and "seeking 1 second before the current point", which both result in the same state for the underlying animated component, but not for the tween which has a different direction.

    design 
    opened by djeedai 0
  • Finish converting all tests to new framework part 1 (sequences)

    Finish converting all tests to new framework part 1 (sequences)

    Hey, I'm back from vacation. :) Can we get the ball rolling again? This PR builds on #37 and again managed to organically catch more bugs (the duration underflow one in particular). Next I'm planning on converting the Tracks tests and fiddling around with Kani to see if we can get some cool proofs going. After that I'd like to revamp/add more benchmarks plus do a clippy pedantic pass and then finally get back to #38.

    opened by SUPERCILEX 0
  • Figure out what to do in tick when tween is completed via set_{elapsed,progress}

    Figure out what to do in tick when tween is completed via set_{elapsed,progress}

    Currently we'll block you from updating the underlying structure if the tween is complete, but we should probably remove that optimization or keep track of whether or not the underlying was updated and perform the update even if the tween is completed.

    design 
    opened by SUPERCILEX 3
Owner
Jerome Humbert
Jerome Humbert
A sprite-sheet animation plugin for bevy

Benimator A sprite sheet animation plugin for bevy Features A SpriteSheetAnimation component to automatically update the indices of the TextureAtlasSp

Jonathan Cornaz 140 Dec 27, 2022
A Client/Server game networking plugin using QUIC, for the Bevy game engine.

Bevy Quinnet A Client/Server game networking plugin using QUIC, for the Bevy game engine. Bevy Quinnet QUIC as a game networking protocol Features Roa

Gilles Henaux 65 Feb 20, 2023
Minecraft-esque voxel engine prototype made with the bevy game engine. Pending bevy 0.6 release to undergo a full rewrite.

vx_bevy A voxel engine prototype made using the Bevy game engine. Goals and features Very basic worldgen Animated chunk loading (ala cube world) Optim

Lucas Arriesse 125 Dec 31, 2022
Inspector plugin for the bevy game engine

bevy-inspector-egui This crate provides the ability to annotate structs with a #[derive(Inspectable)], which opens a debug interface using egui where

Jakob Hellermann 517 Dec 31, 2022
Crossterm plugin for the bevy game engine

What is bevy_crossterm? bevy_crossterm is a Bevy plugin that uses crossterm as a renderer. It provides custom components and events which allow users

null 79 Nov 2, 2022
Hanabi — a particle system plugin for the Bevy game engine.

Hanabi — a particle system plugin for the Bevy game engine

Jerome Humbert 256 Dec 30, 2022
A plugin to enable random number generation for the Bevy game engine.

bevy_turborand A plugin to enable random number generation for the Bevy game engine, built upon turborand. Implements ideas from Bevy's Deterministic

Gonçalo Rica Pais da Silva 15 Dec 23, 2022
A spectator camera plugin for the Bevy game engine

bevy_spectator A spectator camera plugin for the Bevy game engine. Controls Action Key Forward W Left A Backward S Right D Up Space Down LControl Alt.

Jonah Henriksson 5 Jan 2, 2023
📺 An implementation of the retro bouncing DVD logo screensaver animation built with bevy and rust

?? Bevy bouncing DVD logo This project is a simple demonstration of using the Bevy game engine and the Rust programming language to create a bouncing

Victor Aremu 5 Jan 12, 2023
Action-based animation system for Bevy.

bevy_action_animation Action-based animation system for Bevy. Introduction This plugin provides users of the Bevy game engine with an action/trigger-b

undersquire 5 Apr 15, 2023
Animation graphs in Bevy!

bevy_animation_graph Motivation Animation graphs are an essential tool for managing the complexity present in the animation pipelines for modern 3D ga

Manuel Brea Carreras 11 Dec 18, 2023
Interoperation with the Automaton animation engine

Automaton-rs an interopt layer for the Automaton animation engine for creative coding

Aaron Bies 9 Sep 18, 2021
2d Endless Runner Game made with Bevy Game Engine

Cute-runner A 2d Endless Runner Game made with Bevy Game Engine. Table of contents Project Infos Usage Screenshots Disclaimer Project Infos Date: Sept

JoaoMarinho 2 Jul 15, 2022
A game of snake written in Rust using the Bevy game engine, targeting WebGL2

Snake using the Bevy Game Engine Prerequisites cargo install cargo-make Build and serve WASM version Set your local ip address in Makefile.toml (loca

Michael Dorst 0 Dec 26, 2021
A game made in one week for the Bevy engine's first game jam

¿Quien es el MechaBurro? An entry for the first Bevy game jam following the theme of "Unfair Advantage." It was made in one week using the wonderful B

mike 20 Dec 23, 2022
A Bevy Engine plugin for making 2D paths, smooth animations with Bezier curves

bevy_pen_tool A Bevy Engine plugin for making 2D paths and smooth animations with Bezier curves TODO: Mesh-making functionality for building 2D shapes

Eli 36 Dec 22, 2022
Bevy engine + miniquad render plugin

Bevy engine + miniquad renderer This is a plugin for Bevy engine that replaces default windowing and rendering plugins with miniquad based one. Usage

Tomasz Sterna 31 Dec 9, 2022
A Bevy plugin to use Kira for game audio

Bevy Kira audio This bevy plugin is intended to try integrating Kira into Bevy. The end goal would be to replace or update bevy_audio, if Kira turns o

Niklas Eicker 172 Jan 5, 2023
Basic first-person fly camera for the Bevy game engine

bevy_flycam A basic first-person fly camera for Bevy 0.4 Controls WASD to move horizontally SPACE to ascend LSHIFT to descend ESC to grab/release curs

Spencer Burris 85 Dec 23, 2022