* 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 构建错误并优化构建性能
40 lines
1.3 KiB
TypeScript
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
|
|
};
|
|
}
|