#bevy #2d #ui #gamedev #graphics

bevy_stat_bars

用于绘制悬浮状态条的插件

6个版本

0.3.1 2022年9月28日
0.3.0 2022年9月27日
0.2.0 2022年8月5日
0.1.2 2022年6月9日

#1867 in 游戏开发

MIT/Apache

195KB
460

bevy_stat_bars

用于绘制如敌人精灵上方健康条等悬浮状态条的Bevy crate。

版本 0.3

  • 支持Bevy 0.8

本次版本新增

  • 完全重写。新的设计和API。
  • 应该(希望)更容易使用,重新设计似乎更好,但如果您不喜欢这些变化,请告诉我。
  • (似乎)现在与bevy_inspector_egui配合得很好。
  • 暂时移除了任意方向的设置,只有可逆的水平线和垂直线。
  • 状态条可以跟踪资源以及组件。
  • 不需要插件,需要在您的Bevy ```App``` 中为每种状态条添加一个观察者,它们才能开始绘制。
  • 使用PhantomData实现了单个实体上的多个状态条组件。这需要 /media/example.png

使用方法

使用以下命令将依赖项添加到您的Cargo.toml文件中:

[dependencies.bevy_stat_bars]
version = "0.3"

然后,在您的Bevy App上注册您想要使用状态条观察的任何组件

use bevy_stat_bars::*;

App::new()
    .add_plugins(DefaultPlugins)
    .add_statbar_bar_component_observer::<HitPoints>()
    // ..etc, rest of app
    .run();

您还需要在这些组件上实现StatbarObservable特质

impl StatbarObservable for HitPoints {
    fn get_statbar_value(&self) -> f32 {
        self.value / self.max
    }
}

现在,您可以在实体上添加一个Statbar::<HitPoints>组件来可视化其HitPoints组件

commands.entity(enemy_id)
    .insert_bundle((
        Statbar::<HitPoints> {
            empty_color: Color::NAVY,
            length: 10.,
            thickness: 2.,
            displacement: 8. * Vec2::Y,
            ..Default::default()
        },
        StatbarBorder::<HitPoints>::all(Color::WHITE, 1.),
    ));

/media/example2.png

示例

有六个示例您可以查看,涵盖了大多数功能和用例,用以下命令运行它们:

cargo run --example minimal_standalone
cargo run --example basic_interactive
cargo run --example observe_resource
cargo run --example demo
cargo run --example stress --release
cargo run --example stress2 --release

demo示例可能是最有用的一个。

stress2示例使用宏添加了数百种标记类型,编译可能需要几分钟。

注意事项

  • 仅支持2D。

  • 在编写示例时,我犯了一个错误,本应使用

    .add_statbar_component_observer::<Stat<Health>>()
    

    但我使用了

    .add_statbar_component_observer::<Health>()
    

    这很容易忽略。在这种情况下,crate会静默失败,并且不会渲染任何内容,让用户感到沮丧。

    同样,如果状态条被设置为观察其父实体或不存在其他实体,它将渲染一个不会更新的状态条。

  • 状态条使用具有990个Z深度的精灵绘制,如果您将相机向下移动超过10个单位,它们将不会绘制。您可以使用StatbarDepth资源更改深度。

    因此,使用

    commands.insert_resource(StatbarDepth(500.));
    

    所有状态条现在将以500个Z深度渲染。目前还没有办法控制单独状态条绘制的顺序。

  • 仍然使用精灵进行渲染,这不是最佳选择,但性能似乎还可以。您可以通过运行 stress 示例来查看在高负载下的表现。我的rx580大约能跑到100fps。

  • add_statbar_component_observer 为您的Bevy应用中的每个观察到的组件添加六个系统。这也不是最佳选择,但似乎没有问题。在 stress2 示例中,我得到了大约100fps,这个示例创建了100个实体,每个实体有200个Statbars。

未来计划

  • 用自定义渲染器替换基于精灵的渲染。我已经编写了一些片段着色器,并且应该会有更好的性能,并有一些很好的效果,比如圆角和颜色渐变。
  • 饼图仪表
  • 标签和数字指示器
  • 某种形式的,可能是有条件功能的或仅用于调试的,故障检测,当您插入未注册的Statbars时,或当Statbar找不到它应该观察的组件时,会给出错误。
  • 为StatbarObservable推导宏。
  • 自动排列/堆叠Statbar组。我认为这会更困难,但我昨晚想到了一种简单的方法。

依赖关系

~33–48MB
~816K SLoC