#aseprite #动画 #bevy #热重载 #bevy-ui #图集 #加载器

bevy_aseprite_ultra

A Bevy 插件,可直接从 aseprite 二进制文件中加载精灵图和动画,并支持热重载

7个版本

0.2.4 2024年8月2日
0.2.3 2024年7月26日
0.1.1 2024年5月13日
0.1.0 2024年4月22日

#493 in 游戏开发

Download history 2/week @ 2024-05-03 140/week @ 2024-05-10 20/week @ 2024-05-17 2/week @ 2024-05-24 3/week @ 2024-06-07 2/week @ 2024-06-14 136/week @ 2024-07-05 209/week @ 2024-07-12 78/week @ 2024-07-19 205/week @ 2024-07-26 130/week @ 2024-08-02 5/week @ 2024-08-09 24/week @ 2024-08-16

每月378次下载

MIT许可证

1.5MB
697 代码行

Bevy Aseprite Ultra

License: MIT or Apache 2.0 Crate

这是最强大的 bevy aseprite 插件。此插件允许您将 aseprite 文件导入 bevy,具有100%不可中断的热重载。您还可以使用带有功能偏移量的切片从 aseprite 图集类型文件中导入静态精灵!

Bevy 版本 插件版本
0.14 0.2.4
0.13 0.1.0

我在我的游戏中使用了它,请在我的 博客 上查看

支持的 aseprite 功能

  • 动画
  • 标签
  • 帧持续时间、重复和动画方向
  • 图层可见性
  • 混合模式
  • 静态切片和枢轴偏移量

bevy 中的功能

  • 随时随地进行任何热重载!
  • 使用组件完全控制动画。
  • 一次性动画和完成时的事件。
  • 带有切片的静态精灵。使用 aseprite 满足您的所有图标和 UI 需求!

(要使热重载正常工作,您必须安装 bevy 的 file_watcher 货物依赖项)

示例

cargo run --example slices
cargo run --example animations

Example

角色动画由 Benjamin 提供


此插件添加了两个主要包,分别是 AsepriteAnimationBundleAsepriteSliceBundle

use bevy::prelude::*;
use bevy_aseprite_ultra::prelude::*;

...

// Load the an animation from an aseprite file
fn spawn_demo_animation(mut cmd : Commands, server : Res<Assetserver>){
    cmd.spawn(AsepriteAnimationBundle {
        aseprite: server.load("player.aseprite"),
        transform: Transform::from_translation(Vec3::new(15., -20., 0.)),
        animation: Animation::default()
                .with_tag("walk-right")
                .with_speed(2.)
                // Aseprite provides a repeat config per tag, which is beeing ignored on purpose.
                .with_repeat(AnimationRepeat::Count(42))
                // The direction is provided by the asperite config for the tag, but can be overwritten
                // after the animation is loaded.
                .with_direction(AnimationDirection::PingPong)
                // you can also chain finite animations, loop animations with never finish
                .with_then("walk-left", AnimationRepeat::Count(4))
                .with_then("walk-up", AnimationRepeat::Loop)
        // you can override the default sprite settings here
        sprite: Sprite {
            flip_x: true,
            ..default()
        },
        ..default()
    });
}

// Load a static slice from an aseprite file
fn spawn_demo_static_slice(mut cmd : Commands, server : Res<Assetserver>){
    cmd.spawn(AsepriteSliceBundle {
        slice: "ghost_blue".into(),
        // you can override the default sprite settings here
        // the `rect` will be overriden by the slice
        // if there is a pivot provided in the aseprite slice, the `anchor` will be overwritten
        // and changes the origin of rotation.
        sprite: Sprite {
            flip_x: true,
            ..default()
        },
        aseprite: server.load("ghost_slices.aseprite"),
        transform: Transform::from_translation(Vec3::new(32., 0., 0.)),
        ..default()
    });
}

// animation events - tell me when the animation is done
// this is useful for one shot animations like explosions
fn despawn_on_finish(mut events: EventReader<AnimationEvents>, mut cmd : Commands){
    for event in events.read() {
        match event {
            AnimationEvents::Finished(entity) => cmd.entity(*entity).despawn_recursive(),
            // you can also listen for loop cycle repeats
            AnimationEvents::LoopCycleFinished(_entity) => (),
        };
    }
}

Bevy Ui

还有一个 Bevy Ui 节点的 Ui 包!

// animations in bevy ui
cmd.spawn((
        ButtonBundle{
            // node config
            ..default()
        },
        AsepriteAnimationUiBundle{
            aseprite: server.load("yourfile.aseprite"),
            animation: Animation{
                tag : Some("idle".to_string()),
                ..default()
            },
            ..default()
        },
));

// slices in bevy ui
cmd.spawn((
        ImageBundle{
            // node config
            ..default()
        },
        AsepriteSliceUiBundle{
            aseprite: server.load("yourfile.aseprite"),
            slice: AsepriteSlice::from("your_slice"),
            ..default()
        },
));

依赖项

~38–76MB
~1.5M SLoC