@petkoneo/phaser3-rex-plugins
Version:
109 lines (88 loc) • 2.17 kB
Markdown
# BehaviorTree
Reference: https://github.com/behavior3/behavior3js/
## Node/Tree state
- SUCCESS, FAILURE : Return `true`/`false`. Might run next node or child node.
- RUNNING : Stop ticking, run these nodes at next tick.
- ERROR : Error in Nodes.
- Composites node does not have any child.
- Decorator node does not have any child.
## Nodes
- Composite Nodes:
- Selector : MemSelector
- Sequence : MemSequence
- Parallel :
- First child is main task
- Return status of main task
- IfSelector
- SwitchSelector
- WeightSelector : Random select a child with weight
- ShuffleSelector : Shuffle children of selector
- Decorators:
- If
- Bypass
- ForceSuccess
- ForceFailure
- TimeLimit
- Return FAILURE when timeout, else return child statue
- Cooldown :
- Start cooldown when child status is not RUNNING
- Return FAILURE during cooldown, else return child statue
- Repeat
- RepeaterUntilFailure
- RepeaterUntilSuccess
- Invert
- Limiter
- Actions:
- Succeeder
- Failer
- Runner
- Wait
- Wait 0 : Wait a tick
- Error
- Abort
## Logic mapping
### If
```
if ConditionA
TaskA
else if ConditionB
TaskB
else
TaskC
```
Map to
- Selector
- if-ConditionA
- TaskA
- if-ConditionB
- TaskB
- TaskC
### While
```
while ConditionA
TaskA
```
Map to
- RepeaterUntilFailure
- if-ConditionA
- TaskA
### Tick
#### State machine
```javascript
node._execute(tick);
```
```mermaid
graph TD
ENTER("ENTER<br>----<br>node._enter()<br>-> tick._enterNode(), node.enter()")
OPEN("OPEN<br>----<br>node._open()<br>-> tick._openNode(), node.open()")
TICK("TICK<br>----<br>node._tick()<br>-> tick._tickNode(), node.tick()")
CLOSE("CLOSE<br>----<br>node._close()<br>-> tick._closeNode(), node.close()")
EXIT("EXIT<br>----<br>node._exit()<br>-> tick._exitNode(), node.exit()")
ENTER --> |NOT isOpen| OPEN
OPEN --> TICK
ENTER --> |isOpen| TICK
TICK --> |NOT isRunning| CLOSE
CLOSE --> EXIT
TICK --> |isRunning| EXIT
```
- When closing a node, also close children nodes.