* refactor(plugin): 重构插件系统架构,统一类型导入路径 ## 主要更改 ### 新增 @esengine/plugin-types 包 - 提供打破循环依赖的最小类型定义 - 包含 ServiceToken, createServiceToken, PluginServiceRegistry, IEditorModuleBase ### engine-core 类型统一 - IPlugin<T> 泛型参数改为 T = unknown - 所有运行时类型(IRuntimeModule, ModuleManifest, SystemContext)在此定义 - 新增 PluginServiceRegistry.ts 导出服务令牌相关类型 ### editor-core 类型优化 - 重命名 IPluginLoader.ts 为 EditorModule.ts - 新增 IEditorPlugin = IPlugin<IEditorModuleLoader> 类型别名 - 移除弃用别名 IPluginLoader, IRuntimeModuleLoader ### 编辑器插件更新 - 所有 9 个编辑器插件使用 IEditorPlugin 类型 - 统一从 editor-core 导入编辑器类型 ### 服务令牌规范 - 各模块在 tokens.ts 中定义自己的服务接口和令牌 - 遵循"谁定义接口,谁导出 Token"原则 ## 导入规范 | 场景 | 导入来源 | |------|---------| | 运行时模块 | @esengine/engine-core | | 编辑器插件 | @esengine/editor-core | | 服务令牌 | @esengine/engine-core | * refactor(plugin): 完善服务令牌规范,统一运行时模块 ## 更改内容 ### 运行时模块优化 - particle: 使用 PluginServiceRegistry 获取依赖服务 - physics-rapier2d: 通过服务令牌注册/获取物理查询接口 - tilemap: 使用服务令牌获取物理系统依赖 - sprite: 导出服务令牌 - ui: 导出服务令牌 - behavior-tree: 使用服务令牌系统 ### 资产系统增强 - IAssetManager 接口扩展 - 加载器使用服务令牌获取依赖 ### 运行时核心 - GameRuntime 使用 PluginServiceRegistry - 导出服务令牌相关类型 ### 编辑器服务 - EngineService 适配新的服务令牌系统 - AssetRegistryService 优化 * fix: 修复 editor-app 和 behavior-tree-editor 中的类型引用 - editor-app/PluginLoader.ts: 使用 IPlugin 替代 IPluginLoader - behavior-tree-editor: 使用 IEditorPlugin 替代 IPluginLoader * fix(ui): 添加缺失的 ecs-engine-bindgen 依赖 UIRuntimeModule 使用 EngineBridgeToken,需要声明对 ecs-engine-bindgen 的依赖 * fix(type): 解决 ServiceToken 跨包类型兼容性问题 - 在 engine-core 中直接定义 ServiceToken 和 PluginServiceRegistry 而不是从 plugin-types 重新导出,确保 tsup 生成的类型声明 以 engine-core 作为类型来源 - 移除 RuntimeResolver.ts 中的硬编码模块 ID 检查, 改用 module.json 中的 name 配置 - 修复 pnpm-lock.yaml 中的依赖记录 * refactor(arch): 改进架构设计,移除硬编码 - 统一类型导出:editor-core 从 engine-core 导入 IEditorModuleBase - RuntimeResolver: 将硬编码路径改为配置常量和搜索路径列表 - 添加跨平台安装路径支持(Windows/macOS/Linux) - 使用 ENGINE_WASM_CONFIG 配置引擎 WASM 文件信息 - IBundlePackOptions 添加 preloadBundles 配置项 * fix(particle): 添加缺失的 ecs-engine-bindgen 依赖 ParticleRuntimeModule 导入了 @esengine/ecs-engine-bindgen 的 tokens, 但 package.json 中未声明该依赖,导致 CI 构建失败。 * fix(physics-rapier2d): 移除不存在的 PhysicsSystemContext 导出 PhysicsRuntimeModule 中不存在该类型,导致 type-check 失败
ESEngine
English | 中文
Documentation | API Reference | Examples
ESEngine is a cross-platform 2D game engine for creating games from a unified interface. It provides a comprehensive set of common tools so that developers can focus on making games without having to reinvent the wheel.
Games can be exported to multiple platforms including Web browsers, WeChat Mini Games, and other mini-game platforms.
Free and Open Source
ESEngine is completely free and open source under the MIT license. No strings attached, no royalties. Your games are yours.
Features
- Data-Driven Architecture: Built on Entity-Component-System (ECS) pattern for flexible and performant game logic
- High-Performance Rendering: Rust/WebAssembly 2D renderer with sprite batching and WebGL 2.0 backend
- Visual Editor: Cross-platform desktop editor with scene management, asset browser, and visual tools
- Modular Design: Use only what you need. Each feature is a separate module that can be included independently
- Multi-Platform: Deploy to Web, WeChat Mini Games, and more from a single codebase
Getting the Engine
Using npm
npm install @esengine/ecs-framework
Building from Source
See Building from Source for detailed instructions.
Editor Download
Pre-built editor binaries are available on the Releases page for Windows and macOS.
Quick Start
import {
Core, Scene, Entity, Component, EntitySystem,
Matcher, Time, ECSComponent, ECSSystem
} from '@esengine/ecs-framework';
@ECSComponent('Position')
class Position extends Component {
x = 0;
y = 0;
}
@ECSComponent('Velocity')
class Velocity extends Component {
dx = 0;
dy = 0;
}
@ECSSystem('Movement')
class MovementSystem extends EntitySystem {
constructor() {
super(Matcher.all(Position, Velocity));
}
protected process(entities: readonly Entity[]): void {
for (const entity of entities) {
const pos = entity.getComponent(Position);
const vel = entity.getComponent(Velocity);
pos.x += vel.dx * Time.deltaTime;
pos.y += vel.dy * Time.deltaTime;
}
}
}
Core.create();
const scene = new Scene();
scene.addSystem(new MovementSystem());
const player = scene.createEntity('Player');
player.addComponent(new Position());
player.addComponent(new Velocity());
Core.setScene(scene);
// Game loop
let lastTime = 0;
function gameLoop(currentTime: number) {
const deltaTime = (currentTime - lastTime) / 1000;
lastTime = currentTime;
Core.update(deltaTime);
requestAnimationFrame(gameLoop);
}
requestAnimationFrame(gameLoop);
Modules
ESEngine is organized into modular packages. Each feature has a runtime module and an optional editor extension.
Core
| Package | Description |
|---|---|
@esengine/ecs-framework |
Core ECS framework with entity management, component system, and queries |
@esengine/math |
Vector, matrix, and mathematical utilities |
@esengine/engine |
Rust/WASM 2D renderer |
@esengine/engine-core |
Engine module system and lifecycle management |
Runtime Modules
| Package | Description |
|---|---|
@esengine/sprite |
2D sprite rendering and animation |
@esengine/tilemap |
Tile-based map rendering with animation support |
@esengine/physics-rapier2d |
2D physics simulation powered by Rapier |
@esengine/behavior-tree |
Behavior tree AI system |
@esengine/blueprint |
Visual scripting runtime |
@esengine/camera |
Camera control and management |
@esengine/audio |
Audio playback |
@esengine/ui |
UI components |
@esengine/material-system |
Material and shader system |
@esengine/asset-system |
Asset loading and management |
Editor Extensions
| Package | Description |
|---|---|
@esengine/sprite-editor |
Sprite inspector and tools |
@esengine/tilemap-editor |
Visual tilemap editor with brush tools |
@esengine/physics-rapier2d-editor |
Physics collider visualization and editing |
@esengine/behavior-tree-editor |
Visual behavior tree editor |
@esengine/blueprint-editor |
Visual scripting editor |
@esengine/material-editor |
Material and shader editor |
@esengine/shader-editor |
Shader code editor |
Platform
| Package | Description |
|---|---|
@esengine/platform-common |
Platform abstraction interfaces |
@esengine/platform-web |
Web browser runtime |
@esengine/platform-wechat |
WeChat Mini Game runtime |
Editor
ESEngine Editor is a cross-platform desktop application built with Tauri and React.
Features
- Scene hierarchy and entity management
- Component inspector with custom editors
- Asset browser with drag-and-drop support
- Tilemap editor with paint, fill, and selection tools
- Behavior tree visual editor
- Blueprint visual scripting
- Material and shader editing
- Built-in performance profiler
- Localization support (English, Chinese)
Screenshot
Supported Platforms
| Platform | Runtime | Editor |
|---|---|---|
| Web Browser | Yes | - |
| Windows | - | Yes |
| macOS | - | Yes |
| WeChat Mini Game | In Progress | - |
| Playable Ads | Planned | - |
| Android | Planned | - |
| iOS | Planned | - |
| Windows Native | Planned | - |
| Other Platforms | Planned | - |
Building from Source
Prerequisites
- Node.js 18 or later
- pnpm 10 or later
- Rust toolchain (for WASM renderer)
- wasm-pack
Setup
# Clone repository
git clone https://github.com/esengine/ecs-framework.git
cd ecs-framework
# Install dependencies
pnpm install
# Build all packages
pnpm build
# Build WASM renderer (optional)
pnpm build:wasm
Running the Editor
cd packages/editor-app
pnpm tauri:dev
Project Structure
ecs-framework/
├── packages/ Engine packages (runtime, editor, platform)
├── docs/ Documentation source
├── examples/ Example projects
├── scripts/ Build utilities
└── thirdparty/ Third-party dependencies
Documentation
Community
- GitHub Issues - Bug reports and feature requests
- GitHub Discussions - Questions and ideas
Contributing
Contributions are welcome. Please read the contributing guidelines before submitting a pull request.
- Fork the repository
- Create a feature branch
- Make changes with tests
- Submit a pull request
License
ESEngine is licensed under the MIT License.
