{"id":15017967,"url":"https://github.com/djeedai/bevy_tweening","last_synced_at":"2025-05-14T02:09:37.476Z","repository":{"id":37934307,"uuid":"452808982","full_name":"djeedai/bevy_tweening","owner":"djeedai","description":"Tweening animation plugin for the Bevy game engine.","archived":false,"fork":false,"pushed_at":"2025-04-27T17:00:44.000Z","size":4674,"stargazers_count":455,"open_issues_count":25,"forks_count":70,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-04-27T17:35:18.219Z","etag":null,"topics":["animation","bevy","bevy-plugin","rust","tween","tweening","tweening-library"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/djeedai.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-01-27T19:02:58.000Z","updated_at":"2025-04-27T16:39:48.000Z","dependencies_parsed_at":"2023-01-20T23:15:24.256Z","dependency_job_id":"d66c0167-c4f9-4d30-8ba7-ede5aff4e995","html_url":"https://github.com/djeedai/bevy_tweening","commit_stats":{"total_commits":131,"total_committers":16,"mean_commits":8.1875,"dds":0.2137404580152672,"last_synced_commit":"b0bae2ae67a927828ff8a2faa463db0963e1a942"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djeedai%2Fbevy_tweening","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djeedai%2Fbevy_tweening/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djeedai%2Fbevy_tweening/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djeedai%2Fbevy_tweening/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/djeedai","download_url":"https://codeload.github.com/djeedai/bevy_tweening/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254053271,"owners_count":22006717,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["animation","bevy","bevy-plugin","rust","tween","tweening","tweening-library"],"created_at":"2024-09-24T19:51:15.846Z","updated_at":"2025-05-14T02:09:32.462Z","avatar_url":"https://github.com/djeedai.png","language":"Rust","funding_links":[],"categories":["Bevy Engine"],"sub_categories":["Ecosystem"],"readme":"# 🍃 Bevy Tweening\n\n[![License: MIT/Apache](https://img.shields.io/badge/License-MIT%20or%20Apache2-blue.svg)](https://opensource.org/licenses/MIT)\n[![Doc](https://docs.rs/bevy_tweening/badge.svg)](https://docs.rs/bevy_tweening)\n[![Crate](https://img.shields.io/crates/v/bevy_tweening.svg)](https://crates.io/crates/bevy_tweening)\n[![Build Status](https://github.com/djeedai/bevy_tweening/actions/workflows/ci.yaml/badge.svg)](https://github.com/djeedai/bevy_tweening/actions/workflows/ci.yaml)\n[![Coverage Status](https://coveralls.io/repos/github/djeedai/bevy_tweening/badge.svg?branch=main\u0026kill_cache=1)](https://coveralls.io/github/djeedai/bevy_tweening?branch=main)\n[![Bevy tracking](https://img.shields.io/badge/Bevy%20tracking-v0.15-lightblue)](https://github.com/bevyengine/bevy/blob/main/docs/plugins_guidelines.md#main-branch-tracking)\n\nTweening animation plugin for the Bevy game engine.\n\n## Features\n\n- [x] Animate any field of any component or asset, including custom ones.\n- [x] Run multiple tweens (animations) per component/asset in parallel.\n- [x] Chain multiple tweens (animations) one after the other for complex animations.\n- [x] Raise a Bevy event or invoke a callback when an tween completed.\n\n## Usage\n\n### Dependency\n\nAdd to `Cargo.toml`:\n\n```toml\n[dependencies]\nbevy_tweening = \"0.12\"\n```\n\nThis crate supports the following features:\n\n| Feature | Default | Description |\n|---|---|---|\n| `bevy_asset`  | Yes | Enable animating Bevy assets (`Asset`) in addition of components. |\n| `bevy_sprite` | Yes | Includes built-in lenses for some `Sprite`-related components. |\n| `bevy_ui`     | Yes | Includes built-in lenses for some UI-related components. |\n| `bevy_text`   | Yes | Includes built-in lenses for some `Text`-related components. |\n\n### System setup\n\nAdd the `TweeningPlugin` to your app:\n\n```rust\nApp::default()\n    .add_plugins(DefaultPlugins)\n    .add_plugins(TweeningPlugin)\n    .run();\n```\n\nThis provides the basic setup for using 🍃 Bevy Tweening. However, additional setup is required depending on the components and assets you want to animate:\n\n- To ensure a component `C` is animated, the `component_animator_system::\u003cC\u003e` system must run each frame, in addition of adding an `Animator::\u003cC\u003e` component to the same Entity as `C`.\n\n- To ensure an asset `A` is animated, the `asset_animator_system::\u003cA\u003e` system must run each frame, in addition of adding an `AssetAnimator\u003cA\u003e` component to any Entity. Animating assets also requires the `bevy_asset` feature (enabled by default).\n\nBy default, 🍃 Bevy Tweening adopts a minimalist approach, and the `TweeningPlugin` will only add systems to animate components and assets for which a `Lens` is provided by 🍃 Bevy Tweening itself. This means that any other Bevy component or asset (either built-in from Bevy itself, or custom) requires manually scheduling the appropriate system.\n\n| Component or Asset | Animation system added by `TweeningPlugin`? |\n|---|---|\n| `Transform`          | Yes                           |\n| `Sprite`             | Only if `bevy_sprite` feature |\n| `ColorMaterial`      | Only if `bevy_sprite` feature |\n| `Node`               | Only if `bevy_ui` feature     |\n| `TextColor`          | Only if `bevy_text` feature   |\n| All other components | No                            |\n\nTo add a system for a component `C`, use:\n\n```rust\napp.add_systems(Update, component_animator_system::\u003cC\u003e.in_set(AnimationSystem::AnimationUpdate));\n```\n\nSimilarly for an asset `A`, use:\n\n```rust\napp.add_systems(Update, asset_animator_system::\u003cA\u003e.in_set(AnimationSystem::AnimationUpdate));\n```\n\n### Animate a component\n\nAnimate the transform position of an entity by creating a `Tween` animation for the transform, and adding an `Animator` component with that tween:\n\n```rust\n// Create a single animation (tween) to move an entity.\nlet tween = Tween::new(\n    // Use a quadratic easing on both endpoints.\n    EaseFunction::QuadraticInOut,\n    // Animation time (one way only; for ping-pong it takes 2 seconds\n    // to come back to start).\n    Duration::from_secs(1),\n    // The lens gives the Animator access to the Transform component,\n    // to animate it. It also contains the start and end values associated\n    // with the animation ratios 0. and 1.\n    TransformPositionLens {\n        start: Vec3::ZERO,\n        end: Vec3::new(1., 2., -4.),\n    },\n)\n// Repeat twice (one per way)\n.with_repeat_count(RepeatCount::Finite(2))\n// After each iteration, reverse direction (ping-pong)\n.with_repeat_strategy(RepeatStrategy::MirroredRepeat);\n\ncommands.spawn((\n    // Spawn a Sprite entity to animate the position of.\n    Sprite {\n        color: Color::RED,\n        custom_size: Some(Vec2::new(size, size)),\n        ..default()\n    },\n    // Add an Animator component to control and execute the animation.\n    Animator::new(tween),\n));\n```\n\n### Chaining animations\n\nBevy Tweening supports several types of _tweenables_, building blocks that can be combined to form complex animations. A tweenable is a type implementing the `Tweenable\u003cT\u003e` trait.\n\n- **`Tween`** - A simple tween (easing) animation between two values.\n- **`Sequence`** - A series of tweenables executing in series, one after the other.\n- **`Tracks`** - A collection of tweenables executing in parallel.\n- **`Delay`** - A time delay.\n\nMost tweenables can be chained with the `then()` operator:\n\n```rust\n// Produce a sequence executing 'tween1' then 'tween2'\nlet tween1 = Tween { [...] }\nlet tween2 = Tween { [...] }\nlet seq = tween1.then(tween2);\n```\n\n## Predefined Lenses\n\nA 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.**\n\nThe naming scheme for predefined lenses is `\"\u003cTargetName\u003e\u003cFieldName\u003eLens\"`, where `\u003cTargetName\u003e` is the name of the target Bevy component or asset type which is queried by the internal animation system to be modified, and `\u003cFieldName\u003e` 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.\n\n### Bevy Components\n\n| Target Component | Animated Field | Lens | Feature |\n|---|---|---|---|\n| [`Transform`](https://docs.rs/bevy/0.15.0/bevy/transform/components/struct.Transform.html) | [`translation`](https://docs.rs/bevy/0.15.0/bevy/transform/components/struct.Transform.html#structfield.translation)     | [`TransformPositionLens`](https://docs.rs/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/bevy_tweening/lens/struct.TransformPositionLens.html)     | |\n|                                                                                            | [`rotation`](https://docs.rs/bevy/0.15.0/bevy/transform/components/struct.Transform.html#structfield.rotation) (`Quat`)¹ | [`TransformRotationLens`](https://docs.rs/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/bevy_tweening/lens/struct.TransformRotationLens.html)     | |\n|                                                                                            | [`rotation`](https://docs.rs/bevy/0.15.0/bevy/transform/components/struct.Transform.html#structfield.rotation) (angle)²  | [`TransformRotateXLens`](https://docs.rs/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/bevy_tweening/lens/struct.TransformRotateXLens.html)       | |\n|                                                                                            | [`rotation`](https://docs.rs/bevy/0.15.0/bevy/transform/components/struct.Transform.html#structfield.rotation) (angle)²  | [`TransformRotateYLens`](https://docs.rs/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/bevy_tweening/lens/struct.TransformRotateYLens.html)       | |\n|                                                                                            | [`rotation`](https://docs.rs/bevy/0.15.0/bevy/transform/components/struct.Transform.html#structfield.rotation) (angle)²  | [`TransformRotateZLens`](https://docs.rs/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/bevy_tweening/lens/struct.TransformRotateZLens.html)       | |\n|                                                                                            | [`rotation`](https://docs.rs/bevy/0.15.0/bevy/transform/components/struct.Transform.html#structfield.rotation) (angle)²  | [`TransformRotateAxisLens`](https://docs.rs/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/bevy_tweening/lens/struct.TransformRotateAxisLens.html) | |\n|                                                                                            | [`scale`](https://docs.rs/bevy/0.15.0/bevy/transform/components/struct.Transform.html#structfield.scale)                 | [`TransformScaleLens`](https://docs.rs/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/bevy_tweening/lens/struct.TransformScaleLens.html)           | |\n| [`Sprite`](https://docs.rs/bevy/0.15.0/bevy/sprite/struct.Sprite.html)                     | [`color`](https://docs.rs/bevy/0.15.0/bevy/sprite/struct.Sprite.html#structfield.color)                                  | [`SpriteColorLens`](https://docs.rs/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/bevy_tweening/lens/struct.SpriteColorLens.html)                 | `bevy_sprite` |\n| [`Node`](https://docs.rs/bevy/0.15.0/bevy/ui/struct.Node.html)                             | [`position`](https://docs.rs/bevy/0.15.0/bevy/ui/struct.Node.html)                                                       | [`UiPositionLens`](https://docs.rs/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/bevy_tweening/lens/struct.UiPositionLens.html)                   | `bevy_ui`     |\n| [`BackgroundColor`](https://docs.rs/bevy/0.15.0/bevy/ui/struct.BackgroundColor.html)       |                                                                                                                          | [`UiBackgroundColorLens`](https://docs.rs/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/bevy_tweening/lens/struct.UiBackgroundColorLens.html)     | `bevy_ui`     |\n| [`TextColor`](https://docs.rs/bevy/0.15.0/bevy/text/struct.TextColor.html)                 |                                                                                                                          | [`TextColorLens`](https://docs.rs/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/bevy_tweening/lens/struct.TextColorLens.html)                     | `bevy_text`   |\n\nThere are two ways to interpolate rotations. See the [comparison of rotation lenses](https://docs.rs/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/bevy_tweening/lens/index.html#rotations) for details:\n\n- ¹ Shortest-path interpolation between two rotations, using `Quat::slerp()`.\n- ² Angle-based interpolation, valid for rotations over ½ turn.\n\n### Bevy Assets\n\nAsset animation always requires the `bevy_asset` feature.\n\n| Target Asset | Animated Field | Lens | Feature |\n|---|---|---|---|\n| [`ColorMaterial`](https://docs.rs/bevy/0.15.0/bevy/sprite/struct.ColorMaterial.html) | [`color`](https://docs.rs/bevy/0.15.0/bevy/sprite/struct.ColorMaterial.html#structfield.color) | [`ColorMaterialColorLens`](https://docs.rs/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/bevy_tweening/lens/struct.ColorMaterialColorLens.html) | `bevy_asset` + `bevy_sprite` |\n\n## Custom lens\n\nA 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.\n\n```rust\nstruct MyXAxisLens {\n    start: f32,\n    end: f32,\n}\n\nimpl Lens\u003cTransform\u003e for MyXAxisLens {\n    fn lerp(\u0026mut self, target: \u0026mut Transform, ratio: f32) {\n        let start = Vec3::new(self.start, 0., 0.);\n        let end = Vec3::new(self.end, 0., 0.);\n        target.translation = start + (end - start) * ratio;\n    }\n}\n```\n\nNote 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.\n\nThe basic formula for lerp (linear interpolation) is either of:\n\n- `start + (end - start) * scalar`\n- `start * (1.0 - scalar) + end * scalar`\n\nThe 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.\n\n## Custom component support\n\nCustom components are animated via a lens like the ones described in [Bevy Components](#bevy-components).\n\n```rust\n#[derive(Component)]\nstruct MyCustomComponent(f32);\n\nstruct MyCustomLens {\n    start: f32,\n    end: f32,\n}\n\nimpl Lens\u003cMyCustomComponent\u003e for MyCustomLens {\n    fn lerp(\u0026mut self, target: \u0026mut MyCustomComponent, ratio: f32) {\n        target.0 = self.start + (self.end - self.start) * ratio;\n    }\n}\n```\n\nThen, in addition, the system `component_animator_system::\u003cCustomComponent\u003e` needs to be added to the application, as described in [System Setup](#system-setup). This system will extract each frame all `CustomComponent` instances with an `Animator\u003cCustomComponent\u003e` on the same entity, and animate the component via its animator.\n\n## Custom asset support\n\nThe process is similar to custom components, creating a custom lens for the custom asset. The system to add is `asset_animator_system::\u003cCustomAsset\u003e`, as described in [System Setup](#system-setup). This requires the `bevy_asset` feature (enabled by default).\n\n## Examples\n\nSee the [`examples/`](https://github.com/djeedai/bevy_tweening/tree/5fca4fa0139121adef3cbf8187b31c63fd6273c7/examples) folder.\n\n### [`menu`](examples/menu.rs)\n\n```rust\ncargo run --example menu --features=\"bevy/bevy_winit\"\n```\n\n![menu](https://raw.githubusercontent.com/djeedai/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/examples/menu.gif)\n\n### [`sprite_color`](examples/sprite_color.rs)\n\n```rust\ncargo run --example sprite_color --features=\"bevy/bevy_winit\"\n```\n\n![sprite_color](https://raw.githubusercontent.com/djeedai/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/examples/sprite_color.gif)\n\n### [`transform_rotation`](examples/transform_rotation.rs)\n\n```rust\ncargo run --example transform_rotation --features=\"bevy/bevy_winit\"\n```\n\n![sprite_color](https://raw.githubusercontent.com/djeedai/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/examples/transform_rotation.gif)\n\n### [`transform_translation`](examples/transform_translation.rs)\n\n```rust\ncargo run --example transform_translation --features=\"bevy/bevy_winit\"\n```\n\n![sprite_color](https://raw.githubusercontent.com/djeedai/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/examples/transform_translation.gif)\n\n### [`colormaterial_color`](examples/colormaterial_color.rs)\n\n```rust\ncargo run --example colormaterial_color --features=\"bevy/bevy_winit\"\n```\n\n![colormaterial_color](https://raw.githubusercontent.com/djeedai/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/examples/colormaterial_color.gif)\n\n### [`ui_position`](examples/ui_position.rs)\n\n```rust\ncargo run --example ui_position --features=\"bevy/bevy_winit\"\n```\n\n![ui_position](https://raw.githubusercontent.com/djeedai/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/examples/ui_position.gif)\n\n### [`sequence`](examples/sequence.rs)\n\n```rust\ncargo run --example sequence --features=\"bevy/bevy_winit\"\n```\n\n![sequence](https://raw.githubusercontent.com/djeedai/bevy_tweening/5fca4fa0139121adef3cbf8187b31c63fd6273c7/examples/sequence.gif)\n\n## Ease Functions\n\nMany [ease functions](https://docs.rs/bevy/0.15.0/bevy/math/curve/enum.EaseFunction.html) are available from `bevy_math`:\n\n- Linear\n  \u003e `f(t) = t`\n- QuadraticIn\n  \u003e `f(t) = t²`\n- QuadraticOut\n  \u003e `f(t) = -(t * (t - 2.0))`\n- QuadraticInOut\n  \u003e Behaves as `EaseFunction::QuadraticIn` for t \u003c 0.5 and as `EaseFunction::QuadraticOut` for t \u003e= 0.5\n- CubicIn\n  \u003e `f(t) = t³`\n- CubicOut\n  \u003e `f(t) = (t - 1.0)³ + 1.0`\n- CubicInOut\n  \u003e Behaves as `EaseFunction::CubicIn` for t \u003c 0.5 and as `EaseFunction::CubicOut` for t \u003e= 0.5\n- QuarticIn\n  \u003e `f(t) = t⁴`\n- QuarticOut\n  \u003e `f(t) = (t - 1.0)³ * (1.0 - t) + 1.0`\n- QuarticInOut\n  \u003e Behaves as `EaseFunction::QuarticIn` for t \u003c 0.5 and as `EaseFunction::QuarticOut` for t \u003e= 0.5\n- QuinticIn\n  \u003e `f(t) = t⁵`\n- QuinticOut\n  \u003e `f(t) = (t - 1.0)⁵ + 1.0`\n- QuinticInOut\n  \u003e Behaves as `EaseFunction::QuinticIn` for t \u003c 0.5 and as `EaseFunction::QuinticOut` for t \u003e= 0.5\n- SineIn\n  \u003e `f(t) = 1.0 - cos(t * π / 2.0)`\n- SineOut\n  \u003e `f(t) = sin(t * π / 2.0)`\n- SineInOut\n  \u003e Behaves as `EaseFunction::SineIn` for t \u003c 0.5 and as `EaseFunction::SineOut` for t \u003e= 0.5\n- CircularIn\n  \u003e `f(t) = 1.0 - sqrt(1.0 - t²)`\n- CircularOut\n  \u003e `f(t) = sqrt((2.0 - t) * t)`\n- CircularInOut\n  \u003e Behaves as `EaseFunction::CircularIn` for t \u003c 0.5 and as `EaseFunction::CircularOut` for t \u003e= 0.5\n- ExponentialIn\n  \u003e `f(t) = 2.0^(10.0 * (t - 1.0))`\n- ExponentialOut\n  \u003e `f(t) = 1.0 - 2.0^(-10.0 * t)`\n- ExponentialInOut\n  \u003e Behaves as `EaseFunction::ExponentialIn` for t \u003c 0.5 and as `EaseFunction::ExponentialOut` for t \u003e= 0.5\n- ElasticIn\n  \u003e `f(t) = -2.0^(10.0 * t - 10.0) * sin((t * 10.0 - 10.75) * 2.0 * π / 3.0)`\n- ElasticOut\n  \u003e `f(t) = 2.0^(-10.0 * t) * sin((t * 10.0 - 0.75) * 2.0 * π / 3.0) + 1.0`\n- ElasticInOut\n  \u003e Behaves as `EaseFunction::ElasticIn` for t \u003c 0.5 and as `EaseFunction::ElasticOut` for t \u003e= 0.5\n- BackIn\n  \u003e `f(t) = 2.70158 * t³ - 1.70158 * t²`\n- BackOut\n  \u003e `f(t) = 1.0 + 2.70158 * (t - 1.0)³ - 1.70158 * (t - 1.0)²`\n- BackInOut\n  \u003e Behaves as `EaseFunction::BackIn` for t \u003c 0.5 and as `EaseFunction::BackOut` for t \u003e= 0.5\n- BounceIn\n  \u003e bouncy at the start!\n- BounceOut\n  \u003e bouncy at the end!\n- BounceInOut\n  \u003e Behaves as `EaseFunction::BounceIn` for t \u003c 0.5 and as `EaseFunction::BounceOut` for t \u003e= 0.5\n- Steps(usize)\n  \u003e `n` steps connecting the start and the end\n- Elastic(f32)\n  \u003e `f(omega,t) = 1 - (1 - t)²(2sin(omega * t) / omega + cos(omega * t))`, parametrized by omega\n\n## Compatible Bevy versions\n\nThe `main` branch is compatible with the latest Bevy release.\n\nCompatibility of `bevy_tweening` versions:\n\n| `bevy_tweening` | `bevy` |\n| :--             | :--    |\n| `0.12`          | `0.15` |\n| `0.11`          | `0.14` |\n| `0.10`          | `0.13` |\n| `0.9`           | `0.12` |\n| `0.8`           | `0.11` |\n| `0.7`           | `0.10` |\n| `0.6`           | `0.9`  |\n| `0.5`           | `0.8`  |\n| `0.4`           | `0.7`  |\n| `0.2`-`0.3`     | `0.6`  |\n| `0.1`           | `0.5`  |\n\nDue 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. However the `bevy_tweening` crate is upgraded shortly after each new `bevy` release to support the newly released version.\n\n## Comparison with `bevy_easings`\n\nThe `bevy_tweening` library started as a fork of [the `bevy_easings` library by François Mocker](https://github.com/vleue/bevy_easings), with the goals to:\n\n- 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.\n- 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.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdjeedai%2Fbevy_tweening","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdjeedai%2Fbevy_tweening","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdjeedai%2Fbevy_tweening/lists"}