2个不稳定版本
新版本 0.3.0 | 2024年8月11日 |
---|---|
0.2.0 | 2024年8月11日 |
在 过程宏 中排名 #544
每月下载量 198
被 bevy_dogoap 使用
10KB
184 行
面向数据的目标导向行动规划(GOAP)
又称DOGOAP - 以数据导向方式实现的GOAP,便于动态设置状态/动作/目标,而不仅仅是编译时
包含bevy_dogoap,它提供了dogoap库的整洁Bevy集成
实时演示
文档
dogoap
文档 - 可与提供的规划器一起使用的创建动作、状态和目标的独立库bevy_dogoap
文档 - 将dogoap
库集成到Bevy中
为什么我应该使用这个?
- 如果你的NPC需要执行相互依赖的任务(移动到A > 拿起物品X > 移动到B > 放下物品X),GOAP可以帮助你做到这一点
- 如果你想NPC能够自己发挥以达到目标的方式(即“自发现行为”),在你设置动作之后,GOAP可以帮助你做到这一点
- 你正在寻找比效用AI更复杂的东西,但又不想完全使用HTN,GOAP可以帮助你做到这一点
- 如果你看过来自Monolith的人的F.E.A.R GDC演讲(或者Mordor的阴影),并且你知道你想要GOAP,那么这个库可以帮助你跳过无聊的部分 :)
最小Bevy示例
在这个示例中,我们创建了一个IsHungry DatumComponent
,它指示实体是否饥饿,以及一个EatAction ActionComponent
。
#[derive(Component, Reflect, Clone, DatumComponent)]
struct IsHungry(bool);
#[derive(Component, Reflect, Clone, Default, ActionComponent)]
struct EatAction;
fn setup(mut commands: Commands) {
// We want our final outcome to be that IsHungry is set to false
let goal = Goal::from_reqs(&[IsHungry::is(false)]);
// Here we declare that the result of perfoming EatAction is that IsHungry gets set to false
let eat_action = EatAction::new().add_mutator(IsHungry::set(false));
// Creating the planner with everything together gives us Components we can use with Bevy
let (planner, components) = create_planner!({
actions: [(EatAction, eat_action)],
state: [IsHungry(true)],
goals: [goal],
});
// Add `planner` + `components` to your Entity, or spawn a new one
commands.spawn((Name::new("Planner"), planner, components));
}
// System for handling EatAction
fn handle_eat_action(
mut commands: Commands,
mut query: Query<(Entity, &EatAction, &mut IsHungry)>,
) {
for (entity, _eat_action, mut is_hungry) in query.iter_mut() {
is_hungry.0 = false;
commands.entity(entity).remove::<EatAction>();
}
}
一旦运行此代码,规划器将自动确定实体需要执行EatAction以将IsHungry设置为false,而你定义的系统处理动作的实际逻辑。
更复杂的示例可以在这里找到: bevy_dogoap 示例
现有技术 / 其他类似项目
- https://github.com/skyne98/soap - 从这个存储库中汲取了许多灵感,最大的不同是 dogoap 的面向数据结构 + dogoap 提供的紧密 Bevy 集成
- https://github.com/dmackdev/bevy_goap - 原生 Bevy GOAP 库,尽管 API 接口并不理想
- https://github.com/QueenOfSquiggles/bevy_htnp - 原生 Bevy HTN (分层任务网络) 库
许可证
MIT 2024 - Victor Bjelkholm
依赖项
~1.5MB
~35K SLoC