import React, { useState, useCallback } from 'react'; import { IInspectorProvider, InspectorContext, MessageHub, FieldEditorRegistry, FieldEditorContext } from '@esengine/editor-core'; import { Core } from '@esengine/ecs-framework'; import { Node as BehaviorTreeNode } from '../domain/models/Node'; import { PropertyDefinition } from '@esengine/behavior-tree'; /** * 节点属性编辑器组件 */ interface PropertyEditorProps { property: PropertyDefinition; value: any; onChange: (name: string, value: any) => void; } const PropertyEditor: React.FC = ({ property, value, onChange }) => { const handleChange = useCallback((newValue: any) => { onChange(property.name, newValue); }, [property.name, onChange]); const renderInput = () => { // 特殊处理 treeAssetId 字段使用 asset 编辑器 if (property.name === 'treeAssetId') { const fieldRegistry = Core.services.resolve(FieldEditorRegistry); const assetEditor = fieldRegistry.getEditor('asset'); if (assetEditor) { const context: FieldEditorContext = { readonly: false, metadata: { fileExtension: '.btree', placeholder: '拖拽或选择行为树文件' } }; return assetEditor.render({ label: '', value: value ?? property.defaultValue ?? null, onChange: handleChange, context }); } } // 检查是否有特定的字段编辑器类型 if (property.fieldEditor) { const fieldRegistry = Core.services.resolve(FieldEditorRegistry); const editor = fieldRegistry.getEditor(property.fieldEditor.type); if (editor) { const context: FieldEditorContext = { readonly: false, metadata: property.fieldEditor.options }; return editor.render({ label: '', value: value ?? property.defaultValue, onChange: handleChange, context }); } } switch (property.type) { case 'number': return ( handleChange(parseFloat(e.target.value) || 0)} style={{ width: '100%', padding: '4px 8px', backgroundColor: '#2a2a2a', border: '1px solid #444', borderRadius: '3px', color: '#e0e0e0', fontSize: '12px' }} /> ); case 'boolean': return ( ); case 'select': return ( ); case 'code': return (