#行为树 #节点 #树节点 #执行 #AI #并行 #子节点

bin+lib simple_behavior_tree

行为树的一个简单实现

4 个版本

0.1.3 2024年3月7日
0.1.2 2024年3月7日
0.1.1 2024年3月7日
0.1.0 2024年1月19日

31机器人学

Download history 10/week @ 2024-03-30

94 每月下载量

MIT/Apache

13KB
88

Rust 简单行为树

这个 Rust crate 提供了行为树的简单实现,为开发游戏和机器人中的 AI 行为和决策系统提供了一个紧凑且强大的工具。行为树是一种通过简单任务的组合来建模复杂行为流行且非常有效的技术。

功能

  • 序列节点:顺序执行子节点,在第一个失败时停止。
  • 选择器节点:执行子节点直到有一个成功。
  • 并行节点:并行执行子节点,支持“所有必须成功”和“任何一个可以成功”的模式。
  • 动作节点:通过 Rust 闭包或函数执行自定义逻辑。

入门

先决条件

确保您的计算机上已安装 Rust 和 Cargo。如果需要,请访问 Rust 编程语言网站 以获取安装说明。

安装

simple_behavior_tree 添加到项目的 Cargo.toml

[dependencies]
simple_behavior_tree = "0.1.3"

基本用法

此 crate 允许您使用序列节点、选择器节点、并行节点和动作节点构建行为树。下面是创建简单行为树并使用这些节点类型的快速示例

序列节点示例

序列节点按顺序执行其子节点,在第一个失败时停止。以下是创建和执行序列节点的示例

use simple_behavior_tree::{BTNode, BTStatus};

fn main() {
    let action_success = || {
        println!("Action success executed");
        BTStatus::Success
    };

    let action_failure = || {
        println!("Action failure executed");
        BTStatus::Failure
    };

    // Create a sequence node
    let sequence_node = BTNode::Sequence(vec![
        BTNode::Action(action_success),
        BTNode::Action(action_failure),
    ]);

    // Execute the sequence node
    println!("Executing Sequence Node:");
    match sequence_node.tick() {
        BTStatus::Success => println!("Sequence Node succeeded"),
        BTStatus::Failure => println!("Sequence Node failed"),
        BTStatus::Running => println!("Sequence Node is still running"),
    }
}

选择器节点示例

选择器节点执行其子节点直到有一个成功。以下是创建和执行选择器节点的示例

use simple_behavior_tree::{BTNode, BTStatus};

fn main() {
    let action_success = || {
        println!("Action success executed");
        BTStatus::Success
    };

    let action_failure = || {
        println!("Action failure executed");
        BTStatus::Failure
    };

    // Create a selector node
    let selector_node = BTNode::Selector(vec![
        BTNode::Action(action_failure),
        BTNode::Action(action_success),
    ]);

    // Execute the selector node
    println!("\nExecuting Selector Node:");
    match selector_node.tick() {
        BTStatus::Success => println!("Selector Node succeeded"),
        BTStatus::Failure => println!("Selector Node failed"),
        BTStatus::Running => println!("Selector Node is still running"),
    }
}

并行节点示例

并行节点并行执行所有子节点,并基于配置的模式(例如 AnySuccess)成功。以下是创建和执行具有 AnySuccess 模式的并行节点的示例

use simple_behavior_tree::{BTNode, BTStatus, ParallelMode};

fn main() {
    let action_success = || {
        println!("Action success executed");
        BTStatus::Success
    };

    let action_failure = || {
        println!("Action failure executed");
        BTStatus::Failure
    };

    // Create a parallel node with AnySuccess mode
    let parallel_node = BTNode::Parallel(
        ParallelMode::AnySuccess,
        vec![
            BTNode::Action(action_success),
            BTNode::Action(action_failure),
        ],
    );

    // Execute the parallel node
    println!("\nExecuting Parallel Node:");
    match parallel_node.tick() {
        BTStatus::Success => println!("Parallel Node succeeded"),
        BTStatus::Failure => println!("Parallel Node failed"),
        BTStatus::Running => println!("Parallel Node is still running"),
    }
}

条件节点示例

条件节点用于评估是否满足特定条件。如果条件为真,则返回 Success,否则返回 Failure。以下是创建和使用条件节点的示例

use simple_behavior_tree::{BTNode, BTStatus};

// Condition function
fn is_player_in_range() -> BTStatus {
    // Here, you would have logic to determine if the player is in range
    println!("Checking if player is in range...");
    BTStatus::Success // or BTStatus::Failure based on your condition
}

// Action function
fn attack_player() -> BTStatus {
    println!("Attacking player!");
    BTStatus::Success // or BTStatus::Failure based on the action outcome
}

fn main() {
    // Create a sequence node with a condition and an action
    let mut bt = BTNode::Sequence(vec![
        BTNode::Condition(is_player_in_range),
        BTNode::Action(attack_player),
    ]);

    // Execute the behavior tree
    println!("Executing Behavior Tree:");
    match bt.tick() {
        BTStatus::Success => println!("Behavior Tree succeeded."),
        BTStatus::Failure => println!("Behavior Tree failed."),
        BTStatus::Running => println!("Behavior Tree is still running."),
    }
}

本例演示了在行为树中设置序列、选择器、并行和条件节点的基本方法。每种类型的节点都有其独特的功能。

  • 序列节点:顺序执行其子节点,遇到第一个失败则停止。
  • 选择器节点:执行其子节点,直到其中一个成功。
  • 并行节点:并行执行所有子节点,根据配置的模式(例如,AnySuccess)成功。
  • 条件节点:评估特定条件,如果条件满足则返回成功,否则返回失败。

通过组合这些节点,包括决策条件,您可以为游戏、机器人等领域中的AI系统构建复杂的行为树。这种灵活性允许进行复杂的决策过程,其中可以根据条件的评估采取行动,并且可以将任务组织为序列、选择或并行执行。

贡献

欢迎对 simple_behavior_tree 的贡献!无论是错误报告、功能请求还是拉取请求,所有贡献都有助于使该项目变得更好。要贡献

  1. 对存储库进行分叉。
  2. 为每个功能或改进创建一个新的分支。
  3. 从每个功能分支发送拉取请求到主分支进行审查。

许可

simple_behavior_tree 在MIT许可下分发,有关更多信息,请参阅LICENSE。

致谢

  • 感谢Rust社区提供优秀的文档和资源。
  • 受各种行为树实现和游戏开发社区中的讨论启发。

无运行时依赖