feat: 添加跨平台运行时、资产系统和UI适配功能 (#256)

* feat(platform-common): 添加WASM加载器和环境检测API

* feat(rapier2d): 新增Rapier2D WASM绑定包

* feat(physics-rapier2d): 添加跨平台WASM加载器

* feat(asset-system): 添加运行时资产目录和bundle格式

* feat(asset-system-editor): 新增编辑器资产管理包

* feat(editor-core): 添加构建系统和模块管理

* feat(editor-app): 重构浏览器预览使用import maps

* feat(platform-web): 添加BrowserRuntime和资产读取

* feat(engine): 添加材质系统和着色器管理

* feat(material): 新增材质系统和着色器编辑器

* feat(tilemap): 增强tilemap编辑器和动画系统

* feat(modules): 添加module.json配置

* feat(core): 添加module.json和类型定义更新

* chore: 更新依赖和构建配置

* refactor(plugins): 更新插件模板使用ModuleManifest

* chore: 添加第三方依赖库

* chore: 移除BehaviourTree-ai和ecs-astar子模块

* docs: 更新README和文档主题样式

* fix: 修复Rust文档测试和添加rapier2d WASM绑定

* fix(tilemap-editor): 修复画布高DPI屏幕分辨率适配问题

* feat(ui): 添加UI屏幕适配系统(CanvasScaler/SafeArea)

* fix(ecs-engine-bindgen): 添加缺失的ecs-framework-math依赖

* fix: 添加缺失的包依赖修复CI构建

* fix: 修复CodeQL检测到的代码问题

* fix: 修复构建错误和缺失依赖

* fix: 修复类型检查错误

* fix(material-system): 修复tsconfig配置支持TypeScript项目引用

* fix(editor-core): 修复Rollup构建配置添加tauri external

* fix: 修复CodeQL检测到的代码问题

* fix: 修复CodeQL检测到的代码问题
This commit is contained in:
YHH
2025-12-03 22:15:22 +08:00
committed by GitHub
parent caf7622aa0
commit 63f006ab62
496 changed files with 77601 additions and 4067 deletions

View File

@@ -5,7 +5,7 @@
import type { ServiceContainer } from '@esengine/ecs-framework';
import { createLogger } from '@esengine/ecs-framework';
import type { IPlugin, IEditorModuleLoader, PluginDescriptor } from '@esengine/editor-core';
import type { IPlugin, IEditorModuleLoader, ModuleManifest } from '@esengine/editor-core';
import { SettingsRegistry } from '@esengine/editor-core';
import { SettingsService } from '../../services/SettingsService';
@@ -102,27 +102,23 @@ class EditorAppearanceEditorModule implements IEditorModuleLoader {
}
}
const descriptor: PluginDescriptor = {
const manifest: ModuleManifest = {
id: '@esengine/editor-appearance',
name: 'Editor Appearance',
name: '@esengine/editor-appearance',
displayName: 'Editor Appearance',
version: '1.0.0',
description: 'Configure editor appearance settings',
category: 'tools',
category: 'Other',
icon: 'Palette',
enabledByDefault: true,
canContainContent: false,
isEnginePlugin: true,
isCore: true,
modules: [
{
name: 'EditorAppearanceEditor',
type: 'editor',
loadingPhase: 'earliest'
}
]
defaultEnabled: true,
isEngineModule: true,
canContainContent: false,
dependencies: [],
exports: {}
};
export const EditorAppearancePlugin: IPlugin = {
descriptor,
manifest,
editorModule: new EditorAppearanceEditorModule()
};

View File

@@ -4,7 +4,7 @@
*/
import type { ServiceContainer } from '@esengine/ecs-framework';
import type { IPlugin, IEditorModuleLoader, PluginDescriptor, GizmoProviderRegistration } from '@esengine/editor-core';
import type { IPlugin, IEditorModuleLoader, ModuleManifest, GizmoProviderRegistration } from '@esengine/editor-core';
import { registerSpriteGizmo } from '../../gizmos';
/**
@@ -24,27 +24,25 @@ class GizmoEditorModule implements IEditorModuleLoader {
}
}
const descriptor: PluginDescriptor = {
const manifest: ModuleManifest = {
id: '@esengine/gizmo',
name: 'Gizmo System',
name: '@esengine/gizmo',
displayName: 'Gizmo System',
version: '1.0.0',
description: 'Provides gizmo support for editor components',
category: 'tools',
category: 'Other',
icon: 'Move',
enabledByDefault: true,
canContainContent: false,
isEnginePlugin: true,
isCore: true,
modules: [
{
name: 'GizmoEditor',
type: 'editor',
loadingPhase: 'preDefault'
}
]
defaultEnabled: true,
isEngineModule: true,
canContainContent: false,
dependencies: ['engine-core'],
exports: {
other: ['GizmoRegistry']
}
};
export const GizmoPlugin: IPlugin = {
descriptor,
manifest,
editorModule: new GizmoEditorModule()
};

View File

@@ -5,7 +5,7 @@
import type { ServiceContainer } from '@esengine/ecs-framework';
import { createLogger } from '@esengine/ecs-framework';
import type { IPlugin, IEditorModuleLoader, PluginDescriptor } from '@esengine/editor-core';
import type { IPlugin, IEditorModuleLoader, ModuleManifest } from '@esengine/editor-core';
import { SettingsRegistry } from '@esengine/editor-core';
const logger = createLogger('PluginConfigPlugin');
@@ -51,27 +51,23 @@ class PluginConfigEditorModule implements IEditorModuleLoader {
}
}
const descriptor: PluginDescriptor = {
const manifest: ModuleManifest = {
id: '@esengine/plugin-config',
name: 'Plugin Config',
name: '@esengine/plugin-config',
displayName: 'Plugin Config',
version: '1.0.0',
description: 'Configure engine plugins',
category: 'tools',
category: 'Other',
icon: 'Package',
enabledByDefault: true,
canContainContent: false,
isEnginePlugin: true,
isCore: true,
modules: [
{
name: 'PluginConfigEditor',
type: 'editor',
loadingPhase: 'postDefault'
}
]
defaultEnabled: true,
isEngineModule: true,
canContainContent: false,
dependencies: [],
exports: {}
};
export const PluginConfigPlugin: IPlugin = {
descriptor,
manifest,
editorModule: new PluginConfigEditorModule()
};

View File

@@ -7,7 +7,7 @@ import type { ServiceContainer } from '@esengine/ecs-framework';
import type {
IPlugin,
IEditorModuleLoader,
PluginDescriptor,
ModuleManifest,
MenuItemDescriptor
} from '@esengine/editor-core';
import { MessageHub, SettingsRegistry } from '@esengine/editor-core';
@@ -114,26 +114,23 @@ class ProfilerEditorModule implements IEditorModuleLoader {
async onEditorReady(): Promise<void> {}
}
const descriptor: PluginDescriptor = {
const manifest: ModuleManifest = {
id: '@esengine/profiler',
name: 'Performance Profiler',
name: '@esengine/profiler',
displayName: 'Performance Profiler',
version: '1.0.0',
description: 'Real-time performance monitoring for ECS systems',
category: 'tools',
category: 'Other',
icon: 'BarChart3',
enabledByDefault: true,
isCore: false,
defaultEnabled: true,
isEngineModule: true,
canContainContent: false,
isEnginePlugin: true,
modules: [
{
name: 'ProfilerEditor',
type: 'editor',
loadingPhase: 'postDefault'
}
]
dependencies: [],
exports: {}
};
export const ProfilerPlugin: IPlugin = {
descriptor,
manifest,
editorModule: new ProfilerEditorModule()
};

View File

@@ -8,10 +8,25 @@
import type { ServiceContainer } from '@esengine/ecs-framework';
import { createLogger, Core } from '@esengine/ecs-framework';
import type { IPlugin, IEditorModuleLoader, PluginDescriptor } from '@esengine/editor-core';
import { SettingsRegistry, ProjectService } from '@esengine/editor-core';
import type { IPlugin, IEditorModuleLoader, ModuleManifest } from '@esengine/editor-core';
import { SettingsRegistry, ProjectService, moduleRegistry } from '@esengine/editor-core';
import EngineService from '../../services/EngineService';
/**
* Get engine modules from ModuleRegistry.
* 从 ModuleRegistry 获取引擎模块。
*
* Returns all registered modules from the module registry.
* 返回模块注册表中的所有已注册模块。
*/
function getModuleManifests(): ModuleManifest[] {
// Get modules from moduleRegistry singleton
// 从 moduleRegistry 单例获取模块
const modules = moduleRegistry.getAllModules();
console.log('[ProjectSettingsPlugin] getModuleManifests: got', modules.length, 'modules from registry');
return modules;
}
const logger = createLogger('ProjectSettingsPlugin');
/**
@@ -85,6 +100,38 @@ class ProjectSettingsEditorModule implements IEditorModuleLoader {
}))
}
]
},
{
id: 'modules',
title: '引擎模块',
description: '管理项目使用的引擎模块。每个模块包含运行时组件和编辑器工具。禁用不需要的模块可以减小构建体积。',
settings: [
{
key: 'project.disabledModules',
label: '模块列表',
type: 'moduleList',
// Default: no modules disabled (all enabled)
// 默认:没有禁用的模块(全部启用)
defaultValue: [],
description: '取消勾选不需要的模块。核心模块不能禁用。新增的模块会自动启用。',
// Custom props for moduleList type
// Modules are loaded dynamically from ModuleRegistry (sizes from module.json)
// 模块从 ModuleRegistry 动态加载(大小来自 module.json
getModules: getModuleManifests,
// Use blacklist mode: store disabled modules instead of enabled
// 使用黑名单模式:存储禁用的模块而不是启用的
useBlacklist: true,
validateDisable: async (moduleId: string) => {
// Use moduleRegistry singleton for validation
// 使用 moduleRegistry 单例进行验证
const validation = await moduleRegistry.validateDisable(moduleId);
if (!validation.canDisable) {
return { canDisable: false, reason: validation.message };
}
return { canDisable: true };
}
} as any // Cast to any to allow custom props
]
}
]
});
@@ -147,27 +194,23 @@ class ProjectSettingsEditorModule implements IEditorModuleLoader {
}
}
const descriptor: PluginDescriptor = {
const manifest: ModuleManifest = {
id: '@esengine/project-settings',
name: 'Project Settings',
name: '@esengine/project-settings',
displayName: 'Project Settings',
version: '1.0.0',
description: 'Configure project-level settings',
category: 'tools',
category: 'Other',
icon: 'Settings',
enabledByDefault: true,
canContainContent: false,
isEnginePlugin: true,
isCore: true,
modules: [
{
name: 'ProjectSettingsEditor',
type: 'editor',
loadingPhase: 'postDefault'
}
]
defaultEnabled: true,
isEngineModule: true,
canContainContent: false,
dependencies: [],
exports: {}
};
export const ProjectSettingsPlugin: IPlugin = {
descriptor,
manifest,
editorModule: new ProjectSettingsEditorModule()
};

View File

@@ -8,7 +8,7 @@ import type { ServiceContainer } from '@esengine/ecs-framework';
import type {
IPlugin,
IEditorModuleLoader,
PluginDescriptor,
ModuleManifest,
PanelDescriptor,
MenuItemDescriptor,
ToolbarItemDescriptor,
@@ -173,27 +173,25 @@ class SceneInspectorEditorModule implements IEditorModuleLoader {
async onProjectClose(): Promise<void> {}
}
const descriptor: PluginDescriptor = {
const manifest: ModuleManifest = {
id: '@esengine/scene-inspector',
name: 'Scene Inspector',
name: '@esengine/scene-inspector',
displayName: 'Scene Inspector',
version: '1.0.0',
description: 'Scene hierarchy and entity inspector',
category: 'tools',
category: 'Other',
icon: 'Search',
enabledByDefault: true,
canContainContent: false,
isEnginePlugin: true,
isCore: true,
modules: [
{
name: 'SceneInspectorEditor',
type: 'editor',
loadingPhase: 'default'
}
]
defaultEnabled: true,
isEngineModule: true,
canContainContent: false,
dependencies: ['engine-core'],
exports: {
other: ['SceneHierarchy', 'EntityInspector']
}
};
export const SceneInspectorPlugin: IPlugin = {
descriptor,
manifest,
editorModule: new SceneInspectorEditorModule()
};

View File

@@ -7,7 +7,7 @@ export { GizmoPlugin } from './GizmoPlugin';
export { SceneInspectorPlugin } from './SceneInspectorPlugin';
export { ProfilerPlugin } from './ProfilerPlugin';
export { EditorAppearancePlugin } from './EditorAppearancePlugin';
export { PluginConfigPlugin } from './PluginConfigPlugin';
export { ProjectSettingsPlugin } from './ProjectSettingsPlugin';
// Note: PluginConfigPlugin removed - module management is now unified in ProjectSettingsPlugin
// TODO: Re-enable when blueprint-editor package is fixed
// export { BlueprintPlugin } from '@esengine/blueprint-editor';