Skip to content
AI behavior tree
Rust
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src
tests Added unit test for `Sequence` in a `While` Mar 12, 2018
.gitignore Moved in stuff from piston-event Oct 28, 2014
.travis.yml Added .travis.yml Nov 2, 2014
Cargo.toml Published 0.31.0 Jun 10, 2019
LICENSE Initial commit Oct 28, 2014
README.md Added docs.rs badge Nov 24, 2018

README.md

ai_behavior Build Status Docs

AI behavior tree

You can serialize the behavior tree using Serde and e.g. Ron.

What is an AI behavior tree?

An AI behavior tree is a kind of state machine logic for processes.

Many things that a game logic does, e.g. controlling AI characters, fits the pattern of AI behavior trees.

An AI behavior tree is a very generic way of organizing interactive logic. It has built-in semantics for processes that signals Running, Success or Failure.

For example, if you have a state A and a state B:

  • Move from state A to state B if A succeeds: Sequence([A, B])
  • Try A first and then try B if A fails: Select([A, B])
  • Do B repeatedly while A runs: While(A, [B])
  • Do A, B forever: While(WaitForever, [A, B])
  • Wait for both A and B to complete: WhenAll([A, B])
  • Wait for either A or B to complete: WhenAny([A, B])

See the Behavior enum for more information.

Parallel semantics

This library has parallel semantics for AI behavior trees. It means that multiple processes can happen at the same time and the logic can be constructed around how these processes runs or terminate.

For example, While(A, [B]) runs both A and B at the same time. If either A or B fails, then the whole while-behavior fails.

A property of AI behavior trees with parallel semantics is that you can control termination conditions externally, as opposed to most programming languages where termination condition is controlled internally:

while A() {
    // This inner loop will never terminate unless `B` fails.
    while true {
      B();  // Runs `B` forever.
    }
}
// This will terminate if `A` stops running, which also stops `B`.
WhenAny([A,
  While(WaitForever, [
    B
  ])
])

How to contribute

You can’t perform that action at this time.