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);
|
|||
|
|
}
|
|||
|
|
}
|