2025-12-08 21:47:47 +08:00
<h1 align="center">
<img src="https://raw.githubusercontent.com/esengine/esengine/master/docs/public/logo.svg" alt="ESEngine" width="180">
<br>
ESEngine
</h1>
<p align="center">
2025-12-26 14:50:35 +08:00
<strong>Modular Game Framework for TypeScript</strong>
2025-12-08 21:47:47 +08:00
</p>
<p align="center">
<a href="https://www.npmjs.com/package/@esengine/ecs -framework"><img src="https://img.shields.io/npm/v/@esengine/ecs -framework?style=flat-square&color=blue" alt="npm"></a>
2025-12-13 20:56:22 +08:00
<a href="https://github.com/esengine/esengine/actions"><img src="https://img.shields.io/github/actions/workflow/status/esengine/esengine/ci.yml?branch=master&style=flat-square" alt="build"></a>
2025-12-08 21:47:47 +08:00
<a href="https://github.com/esengine/esengine/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green?style=flat-square" alt="license"></a>
<a href="https://github.com/esengine/esengine/stargazers"><img src="https://img.shields.io/github/stars/esengine/esengine?style=flat-square" alt="stars"></a>
2025-12-13 20:56:22 +08:00
<img src="https://img.shields.io/badge/TypeScript-5.0+-blue?style=flat-square&logo=typescript&logoColor=white" alt="TypeScript">
2025-12-08 21:47:47 +08:00
</p>
<p align="center">
<b>English</b> | <a href="./README_CN.md">中文</a>
</p>
<p align="center">
2025-12-09 09:09:45 +08:00
<a href="https://esengine.cn/">Documentation</a> ·
<a href="https://esengine.cn/api/README">API Reference</a> ·
2025-12-08 21:47:47 +08:00
<a href="./examples/">Examples</a>
</p>
---
2025-10-18 23:45:34 +08:00
2025-12-26 14:50:35 +08:00
## What is ESEngine?
2025-12-23 18:00:21 +08:00
2025-12-26 14:50:35 +08:00
ESEngine is a collection of **engine-agnostic game development modules ** for TypeScript. Use them with Cocos Creator, Laya, Phaser, PixiJS, or any JavaScript game engine.
2025-10-18 23:45:34 +08:00
2025-12-26 14:50:35 +08:00
The core is a high-performance **ECS (Entity-Component-System) ** framework, accompanied by optional modules for AI, networking, physics, and more.
2025-10-18 23:45:34 +08:00
2025-12-03 22:15:22 +08:00
```bash
2025-12-08 21:26:35 +08:00
npm install @esengine/ecs -framework
2025-12-03 22:15:22 +08:00
```
2025-08-06 17:04:02 +08:00
2025-12-26 14:50:35 +08:00
## Features
2025-08-06 17:04:02 +08:00
2025-12-26 14:50:35 +08:00
| Module | Description | Engine Required |
|--------|-------------|:---------------:|
| **ECS Core ** | Entity-Component-System framework with reactive queries | No |
| **Behavior Tree ** | AI behavior trees with visual editor support | No |
| **Blueprint ** | Visual scripting system | No |
| **FSM ** | Finite state machine | No |
| **Timer ** | Timer and cooldown systems | No |
| **Spatial ** | Spatial indexing and queries (QuadTree, Grid) | No |
| **Pathfinding ** | A* and navigation mesh pathfinding | No |
2025-12-29 17:12:54 +08:00
| **Procgen ** | Procedural generation (noise, random, sampling) | No |
| **RPC ** | High-performance RPC communication framework | No |
| **Server ** | Game server framework with rooms, auth, rate limiting | No |
| **Network ** | Client networking with prediction, AOI, delta compression | No |
| **Transaction ** | Game transaction system with Redis/Memory storage | No |
| **World Streaming ** | Open world chunk loading and streaming | No |
2025-12-26 14:50:35 +08:00
> All framework modules can be used standalone with any rendering engine.
2025-06-07 20:32:43 +08:00
2025-12-03 22:15:22 +08:00
## Quick Start
2025-06-07 20:32:43 +08:00
2025-12-26 16:37:37 +08:00
### Using CLI (Recommended)
The easiest way to add ECS to your existing project:
```bash
# In your project directory
npx @esengine/cli init
```
The CLI automatically detects your project type (Cocos Creator 2.x/3.x, LayaAir 3.x, or Node.js) and generates the necessary integration code.
### Manual Setup
2025-06-07 20:32:43 +08:00
```typescript
2025-12-03 22:15:22 +08:00
import {
Core, Scene, Entity, Component, EntitySystem,
Matcher, Time, ECSComponent, ECSSystem
2025-12-08 21:26:35 +08:00
} from '@esengine/ecs -framework';
2025-06-07 20:32:43 +08:00
2025-12-26 14:50:35 +08:00
// Define components (data only)
2025-09-28 12:26:51 +08:00
@ECSComponent ('Position')
class Position extends Component {
2025-12-03 22:15:22 +08:00
x = 0;
y = 0;
2025-06-07 20:32:43 +08:00
}
2025-06-09 13:25:10 +08:00
2025-09-28 12:26:51 +08:00
@ECSComponent ('Velocity')
class Velocity extends Component {
2025-12-03 22:15:22 +08:00
dx = 0;
dy = 0;
2025-06-09 13:25:10 +08:00
}
2025-12-26 14:50:35 +08:00
// Define system (logic)
2025-09-28 12:26:51 +08:00
@ECSSystem ('Movement')
2025-08-14 18:38:09 +08:00
class MovementSystem extends EntitySystem {
constructor() {
2025-09-28 12:26:51 +08:00
super(Matcher.all(Position, Velocity));
2025-08-14 18:38:09 +08:00
}
2025-06-12 09:42:35 +08:00
2025-09-28 12:26:51 +08:00
protected process(entities: readonly Entity[]): void {
for (const entity of entities) {
2025-12-03 22:15:22 +08:00
const pos = entity.getComponent(Position);
const vel = entity.getComponent(Velocity);
pos.x += vel.dx * Time.deltaTime;
pos.y += vel.dy * Time.deltaTime;
2025-09-28 12:26:51 +08:00
}
2025-08-11 09:31:44 +08:00
}
}
2025-06-10 13:12:14 +08:00
2025-12-13 20:56:22 +08:00
// Initialize
2025-09-28 12:26:51 +08:00
Core.create();
2025-12-03 22:15:22 +08:00
const scene = new Scene();
scene.addSystem(new MovementSystem());
2025-06-10 13:12:14 +08:00
2025-12-03 22:15:22 +08:00
const player = scene.createEntity('Player');
player.addComponent(new Position());
player.addComponent(new Velocity());
2025-06-10 13:12:14 +08:00
2025-12-03 22:15:22 +08:00
Core.setScene(scene);
2025-12-03 22:48:22 +08:00
2025-12-26 14:50:35 +08:00
// Integrate with your game loop
2025-12-03 22:48:22 +08:00
function gameLoop(currentTime: number) {
2025-12-13 20:56:22 +08:00
Core.update(currentTime / 1000);
2025-12-03 22:48:22 +08:00
requestAnimationFrame(gameLoop);
}
requestAnimationFrame(gameLoop);
2025-10-18 23:45:34 +08:00
```
2025-12-26 14:50:35 +08:00
## Using with Other Engines
ESEngine's framework modules are designed to work alongside your preferred rendering engine:
### With Cocos Creator
```typescript
import { Component as CCComponent, _decorator } from 'cc';
import { Core, Scene, Matcher, EntitySystem } from '@esengine/ecs -framework';
import { BehaviorTreeExecutionSystem } from '@esengine/behavior -tree';
const { ccclass } = _decorator;
@ccclass ('GameManager')
export class GameManager extends CCComponent {
private ecsScene!: Scene;
start() {
Core.create();
this.ecsScene = new Scene();
// Add ECS systems
this.ecsScene.addSystem(new BehaviorTreeExecutionSystem());
this.ecsScene.addSystem(new MyGameSystem());
Core.setScene(this.ecsScene);
}
update(dt: number) {
Core.update(dt);
}
}
```
2025-12-26 16:37:37 +08:00
### With Laya 3.x
2025-12-26 14:50:35 +08:00
```typescript
import { Core, Scene } from '@esengine/ecs -framework';
import { FSMSystem } from '@esengine/fsm ';
2025-12-26 16:37:37 +08:00
const { regClass } = Laya;
2025-12-26 14:50:35 +08:00
2025-12-26 16:37:37 +08:00
@regClass ()
export class ECSManager extends Laya.Script {
private ecsScene = new Scene();
onAwake(): void {
Core.create();
this.ecsScene.addSystem(new FSMSystem());
Core.setScene(this.ecsScene);
2025-12-26 14:50:35 +08:00
}
2025-12-26 16:37:37 +08:00
onUpdate(): void {
2025-12-26 14:50:35 +08:00
Core.update(Laya.timer.delta / 1000);
}
2025-12-26 16:37:37 +08:00
onDestroy(): void {
Core.destroy();
}
2025-12-26 14:50:35 +08:00
}
```
2025-12-13 20:56:22 +08:00
## Packages
2025-06-10 13:12:14 +08:00
2025-12-26 14:50:35 +08:00
### Framework (Engine-Agnostic)
2025-06-10 13:12:14 +08:00
2025-12-26 14:50:35 +08:00
These packages have **zero rendering dependencies ** and work with any engine:
2025-10-16 22:45:08 +08:00
2025-12-24 23:33:12 +08:00
```bash
2025-12-26 14:50:35 +08:00
npm install @esengine/ecs -framework # Core ECS
npm install @esengine/behavior -tree # AI behavior trees
npm install @esengine/blueprint # Visual scripting
npm install @esengine/fsm # State machines
npm install @esengine/timer # Timers & cooldowns
npm install @esengine/spatial # Spatial indexing
npm install @esengine/pathfinding # Pathfinding
2025-12-29 17:12:54 +08:00
npm install @esengine/procgen # Procedural generation
npm install @esengine/rpc # RPC framework
npm install @esengine/server # Game server
npm install @esengine/network # Client networking
npm install @esengine/transaction # Transaction system
npm install @esengine/world -streaming # World streaming
2025-12-24 23:33:12 +08:00
```
2025-10-16 22:45:08 +08:00
2025-12-26 14:50:35 +08:00
### ESEngine Runtime (Optional)
If you want a complete engine solution with rendering:
2025-12-24 23:33:12 +08:00
| Category | Packages |
|----------|----------|
2025-12-26 14:50:35 +08:00
| **Core ** | `engine-core` , `asset-system` , `material-system` |
| **Rendering ** | `sprite` , `tilemap` , `particle` , `camera` , `mesh-3d` |
2025-12-24 23:33:12 +08:00
| **Physics ** | `physics-rapier2d` |
| **Platform ** | `platform-web` , `platform-wechat` |
2025-12-26 14:50:35 +08:00
### Editor (Optional)
2025-06-07 20:32:43 +08:00
2025-12-26 14:50:35 +08:00
A visual editor built with Tauri for scene management:
- Download from [Releases ](https://github.com/esengine/esengine/releases )
2025-12-30 09:54:41 +08:00
- [Build from source ](./packages/editor/editor-app/README.md )
2025-12-26 14:50:35 +08:00
- Supports behavior tree editing, tilemap painting, visual scripting
2025-06-07 20:32:43 +08:00
2025-12-26 14:50:35 +08:00
## Project Structure
2025-06-07 20:32:43 +08:00
2025-12-26 14:50:35 +08:00
```
esengine/
├── packages/
│ ├── framework/ # Engine-agnostic modules (NPM publishable)
│ │ ├── core/ # ECS Framework
│ │ ├── math/ # Math utilities
│ │ ├── behavior-tree/ # AI behavior trees
│ │ ├── blueprint/ # Visual scripting
│ │ ├── fsm/ # Finite state machine
│ │ ├── timer/ # Timer system
│ │ ├── spatial/ # Spatial queries
│ │ ├── pathfinding/ # Pathfinding
│ │ ├── procgen/ # Procedural generation
2025-12-29 17:12:54 +08:00
│ │ ├── rpc/ # RPC framework
│ │ ├── server/ # Game server
│ │ ├── network/ # Client networking
│ │ ├── transaction/ # Transaction system
│ │ └── world-streaming/ # World streaming
2025-12-26 14:50:35 +08:00
│ │
│ ├── engine/ # ESEngine runtime
│ ├── rendering/ # Rendering modules
│ ├── physics/ # Physics modules
│ ├── editor/ # Visual editor
│ └── rust/ # WASM renderer
│
├── docs/ # Documentation
└── examples/ # Examples
```
2025-06-09 13:25:10 +08:00
2025-12-26 14:50:35 +08:00
## Building from Source
2025-06-10 13:12:14 +08:00
2025-12-03 22:15:22 +08:00
```bash
2025-12-08 21:23:37 +08:00
git clone https://github.com/esengine/esengine.git
2025-12-08 21:47:47 +08:00
cd esengine
2025-10-18 23:45:34 +08:00
2025-12-03 22:15:22 +08:00
pnpm install
pnpm build
2025-10-18 23:45:34 +08:00
2025-12-26 14:50:35 +08:00
# Type check framework packages
pnpm type-check:framework
2025-06-09 13:25:10 +08:00
2025-12-26 14:50:35 +08:00
# Run tests
pnpm test
2025-12-03 22:15:22 +08:00
```
2025-06-09 13:25:10 +08:00
2025-12-03 22:15:22 +08:00
## Documentation
2025-10-18 21:48:44 +08:00
2025-12-26 14:50:35 +08:00
- [ECS Framework Guide ](./packages/framework/core/README.md )
- [Behavior Tree Guide ](./packages/framework/behavior-tree/README.md )
2025-12-30 10:01:33 +08:00
- [Editor Setup Guide ](./packages/editor/editor-app/README.md ) ([中文 ](./packages/editor/editor-app/README_CN.md ))
2025-12-09 09:09:45 +08:00
- [API Reference ](https://esengine.cn/api/README )
2025-10-18 21:48:44 +08:00
2025-12-03 22:15:22 +08:00
## Community
2025-10-18 21:48:44 +08:00
2025-12-08 21:23:37 +08:00
- [GitHub Issues ](https://github.com/esengine/esengine/issues ) - Bug reports and feature requests
- [GitHub Discussions ](https://github.com/esengine/esengine/discussions ) - Questions and ideas
2025-12-26 14:50:35 +08:00
- [Discord ](https://discord.gg/gCAgzXFW ) - Chat with the community
2025-10-18 23:45:34 +08:00
2025-12-03 22:15:22 +08:00
## Contributing
2025-10-18 23:45:34 +08:00
2025-12-26 14:50:35 +08:00
Contributions are welcome! Please read our contributing guidelines before submitting a pull request.
2025-10-18 21:48:44 +08:00
2025-12-03 22:15:22 +08:00
1. Fork the repository
2025-12-13 20:56:22 +08:00
2. Create a feature branch (`git checkout -b feature/amazing-feature` )
3. Commit your changes (`git commit -m 'Add amazing feature'` )
4. Push to the branch (`git push origin feature/amazing-feature` )
5. Open a Pull Request
2025-10-18 21:48:44 +08:00
2025-12-03 22:15:22 +08:00
## License
2025-06-07 20:32:43 +08:00
2025-12-26 14:50:35 +08:00
ESEngine is licensed under the [MIT License ](LICENSE ). Free for personal and commercial use.
2025-12-13 20:56:22 +08:00
---
<p align="center">
2025-12-26 14:50:35 +08:00
Made with care by the ESEngine community
2025-12-13 20:56:22 +08:00
</p>