30个版本 (破坏性)

0.21.1 2024年7月9日
0.20.0 2024年5月17日
0.19.0 2024年1月19日
0.18.0 2023年7月16日
0.1.1 2020年7月11日

#32 in 游戏开发

Download history 22/week @ 2024-04-29 17/week @ 2024-05-06 159/week @ 2024-05-13 63/week @ 2024-05-20 14/week @ 2024-05-27 39/week @ 2024-06-03 15/week @ 2024-06-10 16/week @ 2024-06-17 26/week @ 2024-06-24 10/week @ 2024-07-01 249/week @ 2024-07-08 15/week @ 2024-07-15 18/week @ 2024-07-22 42/week @ 2024-07-29 36/week @ 2024-08-05 20/week @ 2024-08-12

每月下载116次

Apache-2.0

105KB
2K SLoC

`big-brain``

crates.io docs.rs Apache 2.0

big-brain是一个为实用AI设计的游戏库,用于Bevy游戏引擎

它允许你根据实体对世界的感知定义复杂的AI行为。定义主要基于数据驱动,使用纯Rust编写,你只需要编写评分器(观察游戏世界并得出评分的实体)和动作(在世界上执行实际行为的实体)。不需要其他代码来处理实际的AI行为。

请参阅文档获取更多详细信息。

功能

  • 高度并发/可并行化评估。
  • 与Bevy无缝集成。
  • 经过验证的游戏AI模型。
  • 高度可组合和可重用。
  • 状态机风格连续动作/行为。
  • 动作取消。

示例

作为开发者,你编写应用程序相关的代码来定义ScorersActions,然后使用Thinkers将它们组合起来,这将定义实际的行为。

评分器

Scorer是观察世界并评估为Score值的实体。你可以把它们看作是AI系统的“眼睛”。它们是高度并行的,可以观察World并使用它来做出一些决策。

use bevy::prelude::*;
use big_brain::prelude::*;

#[derive(Debug, Clone, Component, ScorerBuilder)]
pub struct Thirsty;

pub fn thirsty_scorer_system(
    thirsts: Query<&Thirst>,
    mut query: Query<(&Actor, &mut Score), With<Thirsty>>,
) {
    for (Actor(actor), mut score) in query.iter_mut() {
        if let Ok(thirst) = thirsts.get(*actor) {
            score.set(thirst.thirst);
        }
    }
}
动作

Action是实体将要执行的真正事物。它们连接到表示状态机当前执行状态的ActionState

use bevy::prelude::*;
use big_brain::prelude::*;

#[derive(Debug, Clone, Component, ActionBuilder)]
pub struct Drink;

fn drink_action_system(
    mut thirsts: Query<&mut Thirst>,
    mut query: Query<(&Actor, &mut ActionState), With<Drink>>,
) {
    for (Actor(actor), mut state) in query.iter_mut() {
        if let Ok(mut thirst) = thirsts.get_mut(*actor) {
            match *state {
                ActionState::Requested => {
                    thirst.thirst = 10.0;
                    *state = ActionState::Success;
                }
                ActionState::Cancelled => {
                    *state = ActionState::Failure;
                }
                _ => {}
            }
        }
    }
}
思考者

最后,你可以在定义Thinker时使用它,你可以将其作为常规组件附加

fn spawn_entity(cmd: &mut Commands) {
    cmd.spawn((
        Thirst(70.0, 2.0),
        Thinker::build()
            .picker(FirstToScore { threshold: 0.8 })
            .when(Thirsty, Drink),
    ));
}
应用程序

完成所有这些后,我们只需添加我们的系统,然后就可以出发了!

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugins(BigBrainPlugin::new(PreUpdate))
        .add_systems(Startup, init_entities)
        .add_systems(Update, thirst_system)
        .add_systems(PreUpdate, drink_action_system.in_set(BigBrainSet::Actions))
        .add_systems(PreUpdate, thirsty_scorer_system.in_set(BigBrainSet::Scorers))
        .run();
}

bevy版本和MSRV

当前版本的big-brainbevy 0.12.1兼容。

big-brain的最低支持Rust版本应与bevy的版本相同,截至撰写本文时是“最新稳定版本”。

反射

所有相关的big-brain类型都实现了bevy Reflect特质,因此在使用类似bevy_inspector_egui链接)的工具时,你应该能够获得一些有用的显示信息。

这种实现不应被视为稳定,并且可见的各个字段可能在任何时候更改,且不计入semver。请仅将此功能用于调试。

贡献

  1. 安装最新的Rust工具链(稳定支持)。
  2. cargo运行 --示例thirst
  3. 祝您快乐编程!

许可证

本项目采用Apache-2.0许可证

依赖项

~23MB
~426K SLoC