6个版本 (破坏性更改)

0.6.0 2024年7月8日
0.5.0 2024年6月8日
0.4.0 2024年4月8日
0.3.1 2024年4月4日
0.1.3 2024年3月6日

#177 in 游戏开发

每月26次下载

MIT/Apache

220KB
2.5K SLoC

Crates.io Version Crates.io License Docs.rs

bevy_tween

Bevy过程式和关键帧动画库。

这是一个年轻的插件,API可能需要进一步完善。预期会有破坏性更改!

查看变更日志 这里

功能

  • 直观且用户友好的API:您可以手动启动动画师,但此crate提供了抽象大部分样板代码的API。可以使用功能组合器通过builder构建动画。

    示例
    let sprite_id = commands.spawn(SpriteBundle { ... }).id();
    let sprite = sprite_id.into_target();
    commands.animation()
        .insert(tween(
            Duration::from_secs(1),
            EaseFunction::Linear,
            sprite.with(translation(pos0, pos1))
        ));
    

    您也可以抽象动画!

    fn my_animation(
        target: TargetComponent,
        duration: Duration
    ) -> impl FnOnce(&mut AnimationCommands, &mut Duration) {
        parallel((
            tween(duration, EaseFunction::QuadraticOut, target.with(translation(...))),
            tween(duration, EaseFunction::QuadraticOut, target.with(rotation(...))),
        ))
    }
    
    let sprite_id = commands.spawn(Sprite { ... }).id();
    let sprite = sprite_id.into_target();
    commands.animation().insert(my_animation(sprite, Duration::from_secs(1)))
    
  • 灵活且可扩展:此crate基于 bevy_time_runner 构建,这意味着我们可以通过添加任何组件和系统来扩展此crate。

    • 从任何地方对任何事物进行插值,内置或自定义系统。
    • 使用任何曲线进行插值,内置或自定义系统。
    • 其他任何事物。
  • 并行性:插值是类型化的,可以通过它们的类型化系统进行查询,这增加了系统并行化的机会。

  • 丰富的计时器控制:

    • 循环
    • 时间缩放
    • 向前或向后跳过
    • 跳到任何时间点

演示

目标

  • 灵活 🎉
  • 与其他crate(?)集成
    • bevy_animation
    • bevy_lookup_curve
  • 编辑器。虽然此crate的原始目标是使用代码进行插值,但此crate绝对具有处理任何复杂动画的能力。编辑器将有助于此类任务。
    • 在动画的任何时间点实时显示。
    • 使用任意曲线从点A到点B编辑路径。

差异

此插值crate的主要动机是现有的插值crate不够灵活,因此主要目标是解决此问题。

bevy_tweeningbevy_easings 的差异

  • 插值不与特定实体绑定。您可以在世界中的任何位置创建专门用于插值的实体。
  • 使用子父级层次结构解决复杂的动画,例如顺序或并行插值。
    • 解决了前一个版本中存在的在运行时修改动画的问题。
    • 在ECS世界中,所有内容都存在且没有隐藏的结构,所有内容都可以自由访问。
    • 创建了一个非常可扩展的系统,多亏了Bevy的ECS!
    • 由于这个crate的设计,可以存在多个Interpolator(如果你来自bevy_tweening,则为Lens)来插值相同的组件/资产/资源,因此它不受“每个实体一个组件类型”的限制。
  • 高级计时器。这个crate有自定义计时器实现。
  • 依赖注入。系统通过各种特定组件进行通信,通过提供这些组件来扩展行为以满足您的需求,并减少重复。
  • 这个crate的用户可以自由决定是否只想使用泛型、只想使用特质对象,或者两者都用于插值,甚至完全使用其他内容。

功能门控

  • 默认值
    • bevy_asset
      为资产添加插值系统。
    • bevy_render
      目前除了需要bevy_sprite功能外,没有添加任何内容。
    • bevy_sprite
      添加一些与精灵相关的内置插值器。
    • bevy_ui
      添加一些与UI相关的内置插值器。
    • bevy_eventlistener
      使用bevy_eventlistener添加实体目标事件。
  • 可选

Bevy版本支持

bevy bevy_tween
0.14 0.6
0.13 0.2–0.5

致谢

  • bevy_tweening

    我是第一个发现并尝试在Bevy中进行插值操作的crate。他们的Lens方法很棒,因此它也出现在这个crate中。现在称为Interpolator。用法可能相似,但实现方式不同。

  • godot

    Godot的插值使动画变得简单,这是这个crate的灵感来源。多实体架构主要受Godot节点子父级层次结构系统以及大多数引擎API使用该系统来定义行为的影响。

贡献

欢迎贡献!

许可证

许可协议为以下之一

任选其一。

您的贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您提交给工作内容的任何有意贡献,都应按上述方式双许可,不附加任何额外条款或条件。

演示

cargo运行 --example跟随 -Fbevy/bevy_winit
一个方块将跟随您的圆形,具有可配置的动画。

https://github.com/Multirious/bevy_tween/assets/77918086/d582c2de-0f54-4b22-be03-e3bff3348deb


cargo运行 --example点击 -Fbevy/bevy_winit
点击左键以生成圆形。按住右键以每帧重复生成圆形。

https://github.com/Multirious/bevy_tween/assets/77918086/fd0fe9d3-13a2-4261-880c-cc2609b875ba


cargo运行 --example保持 -Fbevy/bevy_winit
按住左键以增加效果强度。

https://github.com/Multirious/bevy_tween/assets/77918086/33a297a6-19f2-4146-a906-1a88ff037ab3


cargo运行 --example事件 -Fbevy/bevy_winit
展示插值事件功能。

https://github.com/Multirious/bevy_tween/assets/77918086/9507c467-6428-4aed-bd00-511f05e6e951


cargo运行 --example精灵图集 -Fbevy/bevy_winit
精灵图集动画。

https://github.com/Multirious/bevy_tween/assets/77918086/e3997b06-38e6-4add-85f5-a885b69c6687

依赖项

~20–58MB
~1M SLoC