bevy_motiongfx

Crates.iobevy_motiongfx
lib.rsbevy_motiongfx
version0.2.0
created_at2025-10-23 08:51:27.029173+00
updated_at2026-01-22 14:04:30.881844+00
descriptionAn implementation of the MotionGfx framework for Bevy.
homepage
repositoryhttps://github.com/voxell-tech/motiongfx
max_upload_size
id1896815
size112,387
Nixon (nixonyh)

documentation

README

Bevy MotionGfx

License Crates.io Downloads Docs Discord

An integration of the MotionGfx crate for the Bevy game engine.

Usage

Initialization

The BevyMotionGfxPlugin must be added for timeline and controllers to work.

use bevy::prelude::*;
use bevy_motiongfx::BevyMotionGfxPlugin;

App::new()
    .add_plugins((DefaultPlugins, BevyMotionGfxPlugin))
    // Add systems here...
    .run();

Create Animations

For a more thorough walkthrough on the Timeline API, read the MotionGfx docs.

This example demonstrates how to animate an Entity.

use bevy::prelude::*;
use bevy_motiongfx::prelude::*;

fn build_timeline(
    mut commands: Commands,
    mut motiongfx: ResMut<MotionGfxWorld>,
) {
    // Spawn the Entity.
    let entity = commands
        .spawn(Transform::from_xyz(-3.0, 0.0, 0.0))
        .id();

    // Build the timeline.
    let mut b = TimelineBuilder::new();
    let track = b
        .act_interp(entity, field!(<Transform>::translation::x), |x| {
            x + 6.0
        })
        .play(1.0)
        .compile();

    b.add_tracks(track);
    let timeline = b.compile();

    // Spawn the timeline.
    commands.spawn(motiongfx.add_timeline(timeline));
}

This example demonstrates how to animate an Asset.

use bevy::prelude::*;
use bevy_motiongfx::prelude::*;

fn build_timeline(
    mut commands: Commands,
    mut motiongfx: ResMut<MotionGfxWorld>,
    mut materials: ResMut<Assets<StandardMaterial>>
) {
    // Create the asset.
    let material =
        materials.add(StandardMaterial::from_color(Srgba::BLUE));
    // Spawn an entity to prevent the asset from dropping.
    commands.spawn(MeshMaterial3d(material.clone()));

    // Build the timeline.
    let mut b = TimelineBuilder::new();
    let track = b
        .act_interp(
          // AssetIds must be type-erased.
          material.untyped().id(),
          field!(<StandardMaterial>::base_color),
          |_| Srgba::RED.into(),
        )
        .play(1.0)
        .compile();

    b.add_tracks(track);
    let timeline = b.compile();

    // Spawn the timeline.
    commands.spawn(motiongfx.add_timeline(timeline));
}

Controllers

Controllers are helper components for automating the target time and target track of a Timeline.

use bevy::prelude::*;
use bevy_motiongfx::prelude::*;

fn build_timeline(
    mut commands: Commands,
    mut motiongfx: ResMut<MotionGfxWorld>,
) {
    // Build the timeline.
    let mut b = TimelineBuilder::new();
    // Add tracks here...
    let timeline = b.compile();

    // Spawn the timeline with a controller.
    commands.spawn((
        motiongfx.add_timeline(timeline),
        RealtimePlayer::new().with_playing(true),
    ));
}

Version Matrix

Bevy MotionGfx Bevy MotionGfx
0.18 0.2 0.2
0.17 0.1 0.1

License

bevy_motiongfx is dual-licensed under either:

This means you can select the license you prefer! This dual-licensing approach is the de-facto standard in the Rust ecosystem and there are very good reasons to include both.

Commit count: 38

cargo fmt