
Security News
Axios Supply Chain Attack Reaches OpenAI macOS Signing Pipeline, Forces Certificate Rotation
OpenAI rotated macOS signing certificates after a malicious Axios package reached its CI pipeline in a broader software supply chain attack.
@esengine/ai
Advanced tools
一个高性能的TypeScript AI系统库,包含行为树(Behavior Tree)、实用AI(Utility AI)和有限状态机(FSM)。经过全面的性能优化,适用于游戏开发和复杂AI系统构建。
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`);
import { BehaviorTreeBuilder } from '@esengine/ai';
// 从JSON配置文件创建行为树(由可视化编辑器导出)
const config = loadConfigFromFile('my_behavior_tree.json');
// 创建上下文对象
const gameContext = {
health: 100,
position: { x: 0, y: 0 },
// ... 其他游戏数据
};
// 从配置创建行为树
const behaviorTree = BehaviorTreeBuilder.fromConfig(config, gameContext);
// 在游戏循环中更新
behaviorTree.tick();
支持的节点类型: Sequence, Selector, Parallel, AlwaysSucceed, AlwaysFail, Inverter, Repeater, UntilSuccess, UntilFail, LogAction, WaitAction, ExecuteAction 等
欢迎提交Issue和Pull Request!
MIT License - 详见 LICENSE 文件
FAQs
用于Laya、Cocos Creator等JavaScript游戏引擎的高性能AI系统库:行为树、实用AI和有限状态机
We found that @esengine/ai demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
OpenAI rotated macOS signing certificates after a malicious Axios package reached its CI pipeline in a broader software supply chain attack.

Security News
Open source is under attack because of how much value it creates. It has been the foundation of every major software innovation for the last three decades. This is not the time to walk away from it.

Security News
Socket CEO Feross Aboukhadijeh breaks down how North Korea hijacked Axios and what it means for the future of software supply chain security.