移除coreevents事件派发机制

This commit is contained in:
YHH
2025-06-12 09:42:35 +08:00
parent b06174926d
commit 0e3274a743
7 changed files with 152 additions and 105 deletions

View File

@@ -8,6 +8,28 @@
npm install @esengine/ecs-framework
```
## 更新机制说明
ECS框架需要在游戏引擎的更新循环中调用并传入deltaTime
```typescript
// 统一的更新方式让外部引擎传入deltaTime
Core.update(deltaTime);
```
**不同引擎的集成方式:**
- **Laya引擎**:使用 `Laya.timer.delta / 1000`
- **Cocos Creator**:使用组件的 `update(deltaTime)` 参数
- **Unity**:使用 `Time.deltaTime`
- **原生浏览器**自己计算deltaTime
- **Node.js服务器**自己计算deltaTime
**优势:**
- 与引擎时间系统完全同步
- 支持引擎的时间缩放和暂停功能
- 更精确的时间控制
- 统一的API简化集成
## 平台集成
### Laya引擎
@@ -45,7 +67,9 @@ class LayaECSGame extends LayaScene {
}
private updateECS(): void {
this.ecsScene.update();
// 使用Laya的deltaTime更新ECS
const deltaTime = Laya.timer.delta / 1000; // 转换为秒
Core.update(deltaTime);
}
private setupSystems(): void {
@@ -105,8 +129,8 @@ export class ECSGameManager extends CocosComponent {
}
update(deltaTime: number) {
// Cocos的update中更新ECS
this.ecsScene.update();
// 使用Cocos Creator的deltaTime更新ECS
Core.update(deltaTime);
}
onDestroy() {
@@ -188,8 +212,8 @@ class ServerGameManager {
const deltaTime = (now - this.lastUpdate) / 1000;
this.lastUpdate = now;
Time.update(deltaTime);
this.scene.update();
// 使用计算出的deltaTime更新ECS
Core.update(deltaTime);
const frameTime = 1000 / this.tickRate;
const processingTime = Date.now() - now;
@@ -268,11 +292,15 @@ class BrowserGame {
}
private gameLoop(): void {
const update = () => {
this.scene.update();
let lastTime = 0;
const update = (currentTime: number) => {
// 计算deltaTime并更新ECS原生浏览器环境
const deltaTime = lastTime > 0 ? (currentTime - lastTime) / 1000 : 0.016;
lastTime = currentTime;
Core.update(deltaTime);
requestAnimationFrame(update);
};
update();
requestAnimationFrame(update);
}
private setupSystems(): void {
@@ -431,17 +459,33 @@ const enemiesByTag = entityManager.getEntitiesByTag(2);
## 事件系统
```typescript
import { Core, CoreEvents } from '@esengine/ecs-framework';
推荐使用Scene的事件系统或EntityManager的事件系统
// 监听框架事件
Core.emitter.addObserver(CoreEvents.frameUpdated, this.onFrameUpdate, this);
```typescript
// 使用EntityManager的事件系统推荐
const eventBus = entityManager.eventBus;
// 监听ECS事件
eventBus.onEntityCreated((data) => {
console.log(`实体创建: ${data.entityName}`);
});
eventBus.onComponentAdded((data) => {
console.log(`组件添加: ${data.componentType}`);
});
// 发射自定义事件
Core.emitter.emit("playerDied", { player: entity, score: 1000 });
eventBus.emit('player:died', { player: entity, score: 1000 });
// 移除监听
Core.emitter.removeObserver(CoreEvents.frameUpdated, this.onFrameUpdate);
// 使用装饰器自动注册事件监听
import { EventHandler } from '@esengine/ecs-framework';
class GameSystem {
@EventHandler('player:died')
onPlayerDied(data: { player: Entity; score: number }) {
console.log(`玩家死亡,得分: ${data.score}`);
}
}
```
## 性能监控