2个不稳定版本

新版本 0.3.0 2024年8月11日
0.2.0 2024年8月11日

过程宏 中排名 #544

Download history 198/week @ 2024-08-10

每月下载量 198
bevy_dogoap 使用

MIT 许可证

10KB
184

面向数据的目标导向行动规划(GOAP)

License Crates.io Downloads Docs ci

又称DOGOAP - 以数据导向方式实现的GOAP,便于动态设置状态/动作/目标,而不仅仅是编译时

包含bevy_dogoap,它提供了dogoap库的整洁Bevy集成

实时演示

Live Demo

文档

  • 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 示例

现有技术 / 其他类似项目

许可证

MIT 2024 - Victor Bjelkholm

依赖项

~1.5MB
~35K SLoC