- Add BehaviorTreePlugin class that only depends on @esengine/ecs-framework - Implement IPlugin interface with install(), uninstall(), setupScene() methods - Remove esengine/ subdirectory that incorrectly depended on engine-core - Update package documentation with correct usage examples
119 lines
3.4 KiB
TypeScript
119 lines
3.4 KiB
TypeScript
import type { Core, ServiceContainer, IPlugin, IScene } from '@esengine/ecs-framework';
|
||
import { BehaviorTreeExecutionSystem } from './execution/BehaviorTreeExecutionSystem';
|
||
import { BehaviorTreeAssetManager } from './execution/BehaviorTreeAssetManager';
|
||
import { GlobalBlackboardService } from './Services/GlobalBlackboardService';
|
||
|
||
/**
|
||
* @zh 行为树插件
|
||
* @en Behavior Tree Plugin
|
||
*
|
||
* @zh 为 ECS 框架提供行为树支持的插件。
|
||
* 可与任何基于 @esengine/ecs-framework 的引擎集成(Cocos、Laya、Node.js 等)。
|
||
*
|
||
* @en Plugin that provides behavior tree support for ECS framework.
|
||
* Can be integrated with any engine based on @esengine/ecs-framework (Cocos, Laya, Node.js, etc.).
|
||
*
|
||
* @example
|
||
* ```typescript
|
||
* import { Core, Scene } from '@esengine/ecs-framework';
|
||
* import { BehaviorTreePlugin, BehaviorTreeBuilder, BehaviorTreeStarter } from '@esengine/behavior-tree';
|
||
*
|
||
* // Initialize
|
||
* Core.create();
|
||
* const plugin = new BehaviorTreePlugin();
|
||
* await Core.installPlugin(plugin);
|
||
*
|
||
* // Setup scene
|
||
* const scene = new Scene();
|
||
* plugin.setupScene(scene);
|
||
* Core.setScene(scene);
|
||
*
|
||
* // Create and start behavior tree
|
||
* const tree = BehaviorTreeBuilder.create('MyAI')
|
||
* .selector('Root')
|
||
* .log('Hello from behavior tree!')
|
||
* .end()
|
||
* .build();
|
||
*
|
||
* const entity = scene.createEntity('AIEntity');
|
||
* BehaviorTreeStarter.start(entity, tree);
|
||
* ```
|
||
*/
|
||
export class BehaviorTreePlugin implements IPlugin {
|
||
/**
|
||
* @zh 插件名称
|
||
* @en Plugin name
|
||
*/
|
||
readonly name = '@esengine/behavior-tree';
|
||
|
||
/**
|
||
* @zh 插件版本
|
||
* @en Plugin version
|
||
*/
|
||
readonly version = '1.0.0';
|
||
|
||
/**
|
||
* @zh 插件依赖
|
||
* @en Plugin dependencies
|
||
*/
|
||
readonly dependencies: readonly string[] = [];
|
||
|
||
private _services: ServiceContainer | null = null;
|
||
|
||
/**
|
||
* @zh 安装插件
|
||
* @en Install plugin
|
||
*
|
||
* @param _core - Core 实例
|
||
* @param services - 服务容器
|
||
*/
|
||
install(_core: Core, services: ServiceContainer): void {
|
||
this._services = services;
|
||
|
||
// Register services
|
||
if (!services.isRegistered(GlobalBlackboardService)) {
|
||
services.registerSingleton(GlobalBlackboardService);
|
||
}
|
||
if (!services.isRegistered(BehaviorTreeAssetManager)) {
|
||
services.registerSingleton(BehaviorTreeAssetManager);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @zh 卸载插件
|
||
* @en Uninstall plugin
|
||
*/
|
||
uninstall(): void {
|
||
if (this._services) {
|
||
const assetManager = this._services.tryResolve(BehaviorTreeAssetManager);
|
||
if (assetManager) {
|
||
assetManager.dispose();
|
||
}
|
||
|
||
const blackboardService = this._services.tryResolve(GlobalBlackboardService);
|
||
if (blackboardService) {
|
||
blackboardService.dispose();
|
||
}
|
||
}
|
||
this._services = null;
|
||
}
|
||
|
||
/**
|
||
* @zh 设置场景,添加行为树执行系统
|
||
* @en Setup scene, add behavior tree execution system
|
||
*
|
||
* @param scene - 要设置的场景
|
||
*
|
||
* @example
|
||
* ```typescript
|
||
* const scene = new Scene();
|
||
* plugin.setupScene(scene);
|
||
* Core.setScene(scene);
|
||
* ```
|
||
*/
|
||
setupScene(scene: IScene): void {
|
||
const system = new BehaviorTreeExecutionSystem(this._services ?? undefined);
|
||
scene.addSystem(system);
|
||
}
|
||
}
|