#state-machine #finite-state-machine #automata #finite-automata

nightly pure-hfsm

一个具有机器定义与其变化状态之间明确分离的有限状态机库

1 个不稳定版本

0.1.0 2021 年 12 月 15 日

#1330数据结构

MIT/Apache

28KB
412

纯 HFSM

一个具有机器定义与其变化状态之间明确分离的有限状态机库。

我为我的 bevy 项目开发了此库。这就是为什么我给 Behavior::WorldBehavior::UpdateTransition::World 类型提供通用生命周期参数的原因。这需要 GATs,但我在 bevy 中的 SystemParam 那个令人头疼的东西中找到了实现它的唯一方法。

此库的目标是使状态机描述完全独立于状态。因此,我们得到了许多其他状态机库无法轻松或简单地做到的酷功能,例如

  • 状态机的序列化和反序列化
  • 状态和描述的紧凑表示
  • 最小化可变数据,与状态机分离。在 bevy ECS 中,我可以将其作为 Component(而状态机作为 Asset)独立存储
  • 共享状态机,实例数量任选

在开始使用此库之前,有一些缺点需要了解

  • 需要编写更多的模板代码才能使事物正常工作
  • 它不是类型安全的!然而,如果您在 builder::StateMachines 中引用了不存在的状态或机器,您将收到错误!这比在运行转换时收到错误要好得多,但仍然不如编译错误理想。
  • 要使用此库,您必须与三种不同的 StateMachines 类型进行交互(1)是序列化表示 builder(2)是紧凑不可变描述(3)是可变状态句柄或 label

为了使状态机的序列化表示仍然方便且易于维护,同时具有紧凑的内部表示,您需要使用 builder::StateMachines 作为 serde 接口,并将其转换为可运行状态机作为第二步。

可能或可能不会在将来添加的功能

  • 使用 serde cargo 功能标志,可以编译不包含 serde 的库
  • 更好的文档
  • 一个不带 StateData Box<dyn Any>
  • 测试
  • 一个可视化状态机编辑器

许可协议

版权所有 © 2021 Nicola Papale

本软件可在您的选择下以 MIT 或 Apache 2.0 许可协议进行许可。有关详细信息,请参阅 LICENSE 文件。

额外的非约束条件

如果您将此库用于收入超过 100 万美元(相当于 2021 年 1 月的美元)的商业产品,您将执行以下操作之一

  • 给我(Nicola Papale)送一个蛋糕
  • 给我寄一张感谢卡,上面有您的开发团队的签名或至少主要开发者的签名
  • 对项目做出了重大贡献(“重大”由您自行定义,只要您对此诚实即可)
  • 感到羞愧,并承担作为笨蛋的完全道德责任,呜呜

如果不执行前三项中的任何一项,则始终假定遵守了最后一项条款。道德责任不意味着任何其他义务,只是感到羞愧。最值得注意的是,这并不隐含任何财务或法律义务。

依赖关系

~0.6–1.4MB
~30K SLoC