Files
esengine/packages/behavior-tree-editor/src/hooks/useNodeTracking.ts
YHH b42a7b4e43 Feature/editor optimization (#251)
* refactor: 编辑器/运行时架构拆分与构建系统升级

* feat(core): 层级系统重构与UI变换矩阵修复

* refactor: 移除 ecs-components 聚合包并修复跨包组件查找问题

* fix(physics): 修复跨包组件类引用问题

* feat: 统一运行时架构与浏览器运行支持

* feat(asset): 实现浏览器运行时资产加载系统

* fix: 修复文档、CodeQL安全问题和CI类型检查错误

* fix: 修复文档、CodeQL安全问题和CI类型检查错误

* fix: 修复文档、CodeQL安全问题、CI类型检查和测试错误

* test: 补齐核心模块测试用例,修复CI构建配置

* fix: 修复测试用例中的类型错误和断言问题

* fix: 修复 turbo build:npm 任务的依赖顺序问题

* fix: 修复 CI 构建错误并优化构建性能
2025-12-01 22:28:51 +08:00

40 lines
1.3 KiB
TypeScript

import { useState, useEffect, useRef } from '@esengine/editor-runtime';
import { BehaviorTreeNode } from '../stores';
import { ExecutionMode } from '../application/services/ExecutionController';
interface UseNodeTrackingParams {
nodes: BehaviorTreeNode[];
executionMode: ExecutionMode;
}
export function useNodeTracking(params: UseNodeTrackingParams) {
const { nodes, executionMode } = params;
const [uncommittedNodeIds, setUncommittedNodeIds] = useState<Set<string>>(new Set());
const activeNodeIdsRef = useRef<Set<string>>(new Set());
useEffect(() => {
if (executionMode === 'idle') {
setUncommittedNodeIds(new Set());
activeNodeIdsRef.current = new Set(nodes.map((n) => n.id));
} else if (executionMode === 'running' || executionMode === 'paused') {
const currentNodeIds = new Set(nodes.map((n) => n.id));
const newNodeIds = new Set<string>();
currentNodeIds.forEach((id) => {
if (!activeNodeIdsRef.current.has(id)) {
newNodeIds.add(id);
}
});
if (newNodeIds.size > 0) {
setUncommittedNodeIds((prev) => new Set([...prev, ...newNodeIds]));
}
}
}, [nodes, executionMode]);
return {
uncommittedNodeIds
};
}