17个不稳定版本 (7个破坏性更新)

0.8.1 2024年7月20日
0.8.0-rc.02024年6月12日
0.7.0 2024年2月18日
0.6.1 2023年11月26日
0.2.2 2023年7月4日

#566 in 游戏开发

Download history 1773/week @ 2024-05-01 1901/week @ 2024-05-08 1953/week @ 2024-05-15 1832/week @ 2024-05-22 2711/week @ 2024-05-29 2641/week @ 2024-06-05 2512/week @ 2024-06-12 2009/week @ 2024-06-19 2228/week @ 2024-06-26 2432/week @ 2024-07-03 3373/week @ 2024-07-10 2688/week @ 2024-07-17 4550/week @ 2024-07-24 5931/week @ 2024-07-31 4857/week @ 2024-08-07 5404/week @ 2024-08-14

每月21,510次下载
43 个Crate中(6个直接使用)

MIT/Apache

37KB
439

Bevy的事件监听器、冒泡和回调

CI crates.io docs.rs Bevy tracking

事件监听器和回调的实现,允许您使用组件定义行为。

概述

  • 定义可以针对实体触发的自定义事件。
  • 添加事件监听器组件,当指定的事件达到该实体时运行回调。
  • 将回调定义为正常的Bevy系统。
  • 事件在实体层次结构中冒泡,允许您将行为附加到实体树。例如,您可以在场景的根实体上放置一个事件监听器,如果任何子实体被点击,则运行回调。这是因为针对场景子实体的事件会冒泡到层次结构,直到找到事件监听器。

示例

以下是从minimal示例中摘取的,这里有一个穿着几件盔甲的哥布林。一个Attack事件可以针对这些实体中的任何一个。如果Attack达到盔甲,盔甲将尝试吸收攻击。它无法吸收的任何伤害将冒泡到穿着盔甲的哥布林。

commands
    .spawn((
        Name::new("Goblin"),
        HitPoints(50),
        On::<Attack>::run(take_damage),
    ))
    .with_children(|parent| {
        parent.spawn((
            Name::new("Helmet"),
            Armor(5),
            On::<Attack>::run(block_attack),
        ));
        parent.spawn((
            Name::new("Socks"),
            Armor(10),
            On::<Attack>::run(block_attack),
        ));
    });

UI

此库旨在集成到Bevy中,用于制作交互式UI。然而,如上所示,事件冒泡适用于任何需要遍历实体层次结构的事件。这遵循了ECS模式的基本原则:它适用于任何具有所需组件的实体,而不仅仅是UI。

此库最初是从bevy_mod_picking的0.13版本中提取出来的,因为很明显这是一个通用的有用特性。

性能

使用我从最复杂的网站上找到的DOM数据,压力测试示例被构建来帮助使用代表性数据集对这种实现的性能进行基准测试。使用DOM复杂度

  • 深度:64(根实体有多少级子实体)
  • 总节点数:12,800(生成的实体总数)
  • 监听器密度:20%(有多少比例的实体具有事件监听器?)

image

蓝色线条可以解读为“所有这些事件需要多长时间才能在层级中冒泡并触发在约20%的64个节点上的回调?”。对于每个事件都会构建一个作为加速结构的图,这使得我们能够拥有线性扩展的性能。

随着事件总数的增加,每个事件的运行时成本会降低,这是因为图构建对于每种类型的事件都是一个固定成本。添加更多的事件只是在更多的事件中分摊这种成本。在50个事件时,运行时成本仅为~500ns/事件,总成本约为25us。重申一下,这是使用与我能找到的最复杂的网站相似的实体层级。

Bevy版本支持

bevy bevy_eventlistener
0.14 0.8
0.13 0.7
0.12 0.6
0.11 0.5

许可证

本存储库中的所有代码均可在以下任一许可证下双许可:

任由您选择。这意味着您可以选择您喜欢的许可证。

您的贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,任何有意提交以包含在作品中的贡献,将按照上述方式双许可,不附加任何额外条款或条件。

依赖项

~11MB
~196K SLoC