一个高性能的TypeScript AI系统库,包含行为树(Behavior Tree)、实用AI(Utility AI)和有限状态机(FSM)。经过全面的性能优化,适用于游戏开发和复杂AI系统构建。
- 🌳 行为树系统 - 完整的行为树实现,支持复合节点、条件节点、装饰器和动作节点
- 🧠 实用AI系统 - 基于评分的AI决策系统,支持动态行为选择
- 🔄 有限状态机 - 灵活的状态管理系统,支持状态转换和事件处理
- ⚡ 高性能优化 - 内置时间管理、对象池、内存管理等性能优化功能
- 🛡️ 类型安全 - 完整的TypeScript类型支持和运行时类型检查
- 📊 性能监控 - 内置性能统计和监控工具
- 🔧 可配置 - 灵活的配置选项,支持开发和生产环境
npm install @esengine/ai
import { BehaviorTreeBuilder, TaskStatus } from '@esengine/ai';
// 创建一个简单的AI角色
class AICharacter {
public health: number = 100;
public energy: number = 100;
// 创建行为树
createBehaviorTree() {
const builder = BehaviorTreeBuilder.begin(this);
builder.selector()
// 如果生命值低,寻找治疗
.conditionalDecorator(ai => ai.health < 30)
.sequence()
.logAction("寻找治疗")
.action(ai => ai.findHealing())
.endComposite()
// 否则继续巡逻
.sequence()
.action(ai => ai.patrol())
.waitAction(2.0)
.endComposite()
.endComposite();
return builder.build();
}
findHealing(): TaskStatus {
this.health += 10;
return this.health >= 100 ? TaskStatus.Success : TaskStatus.Running;
}
patrol(): TaskStatus {
console.log("正在巡逻...");
this.energy -= 1;
return TaskStatus.Success;
}
}
行为树是一种用于AI决策的树形结构,由不同类型的节点组成。
复合节点控制子节点的执行流程:
import { BehaviorTreeBuilder, AbortTypes } from '@esengine/ai';
// Sequence - 顺序执行,任一失败则整体失败
builder.sequence()
.action(ai => ai.moveToTarget())
.action(ai => ai.attack())
.endComposite();
// Selector - 选择执行,任一成功则整体成功
builder.selector()
.action(ai => ai.tryMeleeAttack())
.action(ai => ai.tryRangedAttack())
.action(ai => ai.retreat())
.endComposite();
// Parallel - 并行执行所有子节点
builder.parallel()
.action(ai => ai.move())
.action(ai => ai.lookAround())
.endComposite();
条件节点用于检查游戏状态:
// 自定义条件
class HealthCheckConditional extends Conditional<AICharacter> {
private minHealth: number;
constructor(minHealth: number) {
super();
this.minHealth = minHealth;
}
update(context: AICharacter): TaskStatus {
return context.health >= this.minHealth ?
TaskStatus.Success : TaskStatus.Failure;
}
}
// 使用条件装饰器
builder.conditionalDecorator(ai => ai.health > 50)
.action(ai => ai.aggressiveAttack())
.endComposite();
装饰器修改子节点的行为:
// 重复执行直到失败
builder.untilFail()
.action(ai => ai.patrol())
.endComposite();
// 反转结果
builder.inverter()
.conditional(ai => ai.isEnemyNear())
.endComposite();
// 重复指定次数
builder.repeater(3)
.action(ai => ai.shoot())
.endComposite();
支持动态行为中止:
builder.selector(AbortTypes.Self)
// 高优先级:逃跑
.conditionalDecorator(ai => ai.health < 20)
.sequence(AbortTypes.LowerPriority)
.action(ai => ai.flee())
.endComposite()
// 中优先级:攻击
.conditionalDecorator(ai => ai.canSeeEnemy())
.sequence(AbortTypes.LowerPriority)
.action(ai => ai.attack())
.endComposite()
// 低优先级:巡逻
.action(ai => ai.patrol())
.endComposite();
实用AI基于评分系统进行决策:
import { UtilityAI, Consideration, Action } from '@esengine/ai';
class AttackAction extends Action<AICharacter> {
execute(context: AICharacter): void {
context.attack();
}
}
class HealthConsideration extends Consideration<AICharacter> {
getScore(context: AICharacter): number {
// 生命值越低,攻击欲望越低
return context.health / 100;
}
}
class EnemyDistanceConsideration extends Consideration<AICharacter> {
getScore(context: AICharacter): number {
const distance = context.getDistanceToEnemy();
// 距离越近,攻击欲望越高
return Math.max(0, 1 - distance / 10);
}
}
// 创建实用AI
const utilityAI = new UtilityAI<AICharacter>();
const attackAction = new AttackAction();
attackAction.addConsideration(new HealthConsideration());
attackAction.addConsideration(new EnemyDistanceConsideration());
utilityAI.addAction(attackAction);
状态机用于管理AI的不同状态:
import { StateMachine, State } from '@esengine/ai';
class PatrolState extends State<AICharacter> {
update(context: AICharacter): void {
context.patrol();
if (context.canSeeEnemy()) {
context.stateMachine.changeState(CombatState);
}
}
}
class CombatState extends State<AICharacter> {
update(context: AICharacter): void {
context.attack();
if (!context.canSeeEnemy()) {
context.stateMachine.changeState(PatrolState);
}
}
}
// 创建状态机
const stateMachine = new StateMachine<AICharacter>(character, new PatrolState());
stateMachine.addState(new CombatState());
高效的时间管理系统:
import { TimeManager } from '@esengine/ai';
// 启用时间池化
TimeManager.enablePooling(true);
// 设置时间缩放
TimeManager.setTimeScale(1.5);
// 获取优化的时间
const currentTime = TimeManager.getCurrentTime();
const deltaTime = TimeManager.getDeltaTime();
减少垃圾回收压力:
import { AdvancedObjectPool } from '@esengine/ai';
// 创建对象池
const bulletPool = new AdvancedObjectPool(
() => new Bullet(), // 创建函数
bullet => bullet.reset(), // 重置函数
{
initialSize: 50,
maxSize: 200,
priority: 'high'
}
);
// 获取对象
const bullet = bulletPool.get();
// 归还对象
bulletPool.release(bullet);
可配置的错误处理:
import { ErrorHandler, ErrorLevel } from '@esengine/ai';
// 设置错误级别
ErrorHandler.setLevel(ErrorLevel.Production);
// 启用性能监控
ErrorHandler.enablePerformanceMonitoring(true);
// 使用装饰器进行自动错误处理
class MyAI {
@ErrorHandler.handleErrors()
public complexOperation(): void {
// 复杂的AI逻辑
}
}
防止内存泄漏的事件系统:
import { EventManager } from '@esengine/ai';
const eventManager = new EventManager();
// 添加监听器
const listenerId = eventManager.on('enemy-spotted', (data) => {
console.log('发现敌人:', data);
});
// 自动清理监听器
eventManager.on('player-died', callback, {
once: true, // 只执行一次
ttl: 5000 // 5秒后自动移除
});
// 手动移除监听器
eventManager.off('enemy-spotted', listenerId);
import { PerformanceConfig } from '@esengine/ai';
PerformanceConfig.set({
enableObjectPooling: true,
enableTimePooling: true,
maxPoolSize: 1000,
enablePerformanceMonitoring: true,
logLevel: 'warn'
});
import { DevConfig } from '@esengine/ai';
// 开发模式
DevConfig.enableDebugMode(true);
DevConfig.enableVerboseLogging(true);
DevConfig.enableTypeChecking(true);
// 生产模式
DevConfig.enableProductionMode();
import { PerformanceMonitor } from '@esengine/ai';
// 获取行为树性能统计
const btStats = PerformanceMonitor.getBehaviorTreeStats();
console.log(`平均执行时间: ${btStats.averageExecutionTime}ms`);
// 获取对象池统计
const poolStats = PerformanceMonitor.getObjectPoolStats();
console.log(`池命中率: ${poolStats.hitRate}%`);
// 获取内存使用情况
const memoryStats = PerformanceMonitor.getMemoryStats();
console.log(`内存使用: ${memoryStats.usedMemory}MB`);
- 保持树的深度合理(建议不超过6层)
- 使用条件装饰器进行早期退出
- 合理使用中止类型避免不必要的计算
- 将复杂逻辑拆分为多个简单节点
- 在生产环境中禁用调试日志
- 使用对象池管理频繁创建的对象
- 避免在update方法中进行复杂计算
- 使用时间管理器减少时间计算开销
- 及时清理事件监听器
- 使用弱引用避免循环引用
- 定期清理不再使用的对象池
- 监控内存使用情况
欢迎提交Issue和Pull Request!
MIT License - 详见 LICENSE 文件