Skip to content

Asset Management

import { BehaviorTreeLoader } from '@esengine/behavior-tree';
// Load from URL
const tree = await BehaviorTreeLoader.load('assets/enemy-ai.json');
// Load from object
const tree = BehaviorTreeLoader.fromData(jsonData);
import { AssetManager } from '@esengine/asset-system';
// Register loader
AssetManager.registerLoader('btree', BehaviorTreeLoader);
// Load asset
const tree = await AssetManager.load<BehaviorTreeData>('enemy-ai.btree');

Reuse behavior trees as subtrees:

// Create a reusable patrol behavior
const patrolTree = BehaviorTreeBuilder.create('PatrolBehavior')
.sequence('Patrol')
.action('moveToWaypoint')
.wait(2000)
.action('nextWaypoint')
.end()
.build();
// Use as subtree in main AI
const enemyAI = BehaviorTreeBuilder.create('EnemyAI')
.selector('Main')
.sequence('Combat')
.condition('hasTarget')
.action('attack')
.end()
// Include patrol subtree
.subtree(patrolTree)
.end()
.build();

Reference external trees by ID:

const tree = BehaviorTreeBuilder.create('MainAI')
.selector('Root')
.subtreeRef('combat-behavior') // References another tree
.subtreeRef('patrol-behavior')
.end()
.build();
// Trees are cached automatically
const cache = BehaviorTreeLoader.getCache();
// Clear specific tree
cache.remove('enemy-ai');
// Clear all
cache.clear();

During development:

// Enable hot reload
BehaviorTreeLoader.enableHotReload();
// Trees will automatically update when files change