1 个不稳定版本
0.1.0 | 2021 年 12 月 15 日 |
---|
#1330 在 数据结构
28KB
412 行
纯 HFSM
一个具有机器定义与其变化状态之间明确分离的有限状态机库。
我为我的 bevy 项目开发了此库。这就是为什么我给 Behavior::World
、Behavior::Update
和 Transition::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