v2.0.4
ECS Framework
一个轻量级的 TypeScript ECS(Entity-Component-System)框架,专为小游戏开发设计,适用于 Laya、Cocos 等游戏引擎。
✨ 特性
- 🚀 轻量级 ECS 架构 - 基于实体组件系统,提供清晰的代码结构
- 📡 事件系统 - 内置 Emitter 事件发射器,支持类型安全的事件管理
- ⏰ 定时器系统 - 完整的定时器管理,支持延迟和重复任务
- 🔍 查询系统 - 基于位掩码的高性能实体查询
- 🛠️ 性能监控 - 内置性能监控工具,帮助优化游戏性能
- 🎯 对象池 - 内存管理优化,减少垃圾回收压力
- 📊 数学库 - 完整的 2D 数学运算支持
📦 安装
npm install @esengine/ecs-framework
🚀 快速开始
1. 初始化框架
import { Core, CoreEvents } from '@esengine/ecs-framework';
// 创建 Core 实例
const core = Core.create(true); // true 表示开启调试模式
// 在游戏循环中更新框架
function gameLoop() {
// 发送帧更新事件
Core.emitter.emit(CoreEvents.frameUpdated);
}
2. 创建场景
import { Scene, Vector2, EntitySystem } from '@esengine/ecs-framework';
class GameScene extends Scene {
public initialize() {
// 创建玩家实体
const player = this.createEntity("Player");
// 设置位置
player.position = new Vector2(100, 100);
// 添加自定义组件
const movement = player.addComponent(new MovementComponent());
// 添加系统
this.addEntityProcessor(new MovementSystem());
}
public onStart() {
console.log("游戏场景已启动");
}
}
// 设置当前场景
Core.scene = new GameScene();
3. 创建组件
import { Component, Vector2, Time } from '@esengine/ecs-framework';
class MovementComponent extends Component {
public speed: number = 100;
public direction: Vector2 = Vector2.zero;
public update() {
if (this.direction.length > 0) {
const movement = this.direction.multiply(this.speed * Time.deltaTime);
this.entity.position = this.entity.position.add(movement);
}
}
}
4. 创建系统
import { EntitySystem, Entity } from '@esengine/ecs-framework';
class MovementSystem extends EntitySystem {
protected process(entities: Entity[]) {
for (const entity of entities) {
const movement = entity.getComponent(MovementComponent);
if (movement) {
movement.update();
}
}
}
}
📚 核心概念
Entity(实体)
实体是游戏世界中的基本对象,包含位置、旋转、缩放等基本属性,可以添加组件来扩展功能。
import { Vector2 } from '@esengine/ecs-framework';
const entity = scene.createEntity("MyEntity");
entity.position = new Vector2(100, 200);
entity.rotation = Math.PI / 4;
entity.scale = new Vector2(2, 2);
Component(组件)
组件包含数据和行为,定义了实体的特性。
import { Component } from '@esengine/ecs-framework';
class HealthComponent extends Component {
public maxHealth: number = 100;
public currentHealth: number = 100;
public takeDamage(damage: number) {
this.currentHealth = Math.max(0, this.currentHealth - damage);
if (this.currentHealth <= 0) {
this.entity.destroy();
}
}
}
System(系统)
系统处理实体集合,实现游戏逻辑。
import { EntitySystem, Entity } from '@esengine/ecs-framework';
class HealthSystem extends EntitySystem {
protected process(entities: Entity[]) {
for (const entity of entities) {
const health = entity.getComponent(HealthComponent);
if (health && health.currentHealth <= 0) {
entity.destroy();
}
}
}
}
🎮 高级功能
事件系统
import { Core, CoreEvents } from '@esengine/ecs-framework';
// 监听事件
Core.emitter.addObserver(CoreEvents.frameUpdated, this.onFrameUpdate, this);
// 发射自定义事件
Core.emitter.emit("playerDied", { player: entity, score: 1000 });
// 移除监听
Core.emitter.removeObserver(CoreEvents.frameUpdated, this.onFrameUpdate);
定时器系统
import { Core } from '@esengine/ecs-framework';
// 延迟执行
Core.schedule(2.0, false, this, (timer) => {
console.log("2秒后执行");
});
// 重复执行
Core.schedule(1.0, true, this, (timer) => {
console.log("每秒执行一次");
});
实体查询
// 按名称查找
const player = scene.findEntity("Player");
// 按标签查找
const enemies = scene.findEntitiesByTag(1);
// 按ID查找
const entity = scene.findEntityById(123);
性能监控
import { PerformanceMonitor } from '@esengine/ecs-framework';
// 获取性能数据
const monitor = PerformanceMonitor.instance;
console.log("平均FPS:", monitor.averageFPS);
console.log("内存使用:", monitor.memoryUsage);
🛠️ 开发工具
对象池
// 创建对象池
class BulletPool extends es.Pool<Bullet> {
protected createObject(): Bullet {
return new Bullet();
}
}
const bulletPool = new BulletPool();
// 获取对象
const bullet = bulletPool.obtain();
// 释放对象
bulletPool.free(bullet);
实体调试
// 获取实体调试信息
const debugInfo = entity.getDebugInfo();
console.log("实体信息:", debugInfo);
// 获取场景统计
const stats = scene.getStats();
console.log("场景统计:", stats);
📖 文档
🔗 扩展库
🤝 贡献
欢迎提交 Issue 和 Pull Request!
开发环境设置
# 克隆项目
git clone https://github.com/esengine/ecs-framework.git
# 进入源码目录
cd ecs-framework/source
# 安装依赖
npm install
# 构建项目
npm run build
# 运行测试
npm test
构建要求
- Node.js >= 14.0.0
- TypeScript >= 4.0.0
📄 许可证
本项目采用 MIT 许可证。
💬 交流群
加入 QQ 群讨论:ecs游戏框架交流
ECS Framework - 让游戏开发更简单、更高效!
Description
【开源】TypeScript 可视化蓝图系统
https://esengine.cn/modules/blueprint/cocos-editor/
https://forum.cocos.org/t/topic/173430
Languages
TypeScript
89.7%
Rust
4.7%
CSS
4.4%
JavaScript
0.9%
HTML
0.3%