新增scenemanager,重构core类减少多世界造成的性能压力
This commit is contained in:
@@ -264,22 +264,17 @@ player.addComponent(new Velocity(50, 30)); // 每秒移动 50 像素(x方向
|
||||
player.addComponent(new Sprite("player.png", 64, 64));
|
||||
```
|
||||
|
||||
## World 概念
|
||||
## 场景管理
|
||||
|
||||
World 是 Scene 的容器,用于管理多个独立的游戏世界。这种设计特别适用于:
|
||||
- 多人游戏房间(每个房间一个 World)
|
||||
- 不同的游戏模式
|
||||
- 独立的模拟环境
|
||||
|
||||
### 基本用法
|
||||
Core 内置了场景管理功能,使用非常简单:
|
||||
|
||||
```typescript
|
||||
import { World, Scene } from '@esengine/ecs-framework'
|
||||
import { Core, Scene } from '@esengine/ecs-framework';
|
||||
|
||||
// 创建游戏房间的World
|
||||
const roomWorld = new World({ name: 'Room_001' });
|
||||
// 初始化Core
|
||||
Core.create({ debug: true });
|
||||
|
||||
// 在World中创建多个Scene
|
||||
// 创建并设置场景
|
||||
class GameScene extends Scene {
|
||||
initialize(): void {
|
||||
this.name = "GamePlay";
|
||||
@@ -288,78 +283,106 @@ class GameScene extends Scene {
|
||||
}
|
||||
}
|
||||
|
||||
class UIScene extends Scene {
|
||||
initialize(): void {
|
||||
this.name = "UI";
|
||||
// UI相关系统
|
||||
}
|
||||
const gameScene = new GameScene();
|
||||
Core.setScene(gameScene);
|
||||
|
||||
// 游戏循环(自动更新场景)
|
||||
function gameLoop(deltaTime: number) {
|
||||
Core.update(deltaTime); // 自动更新全局服务和场景
|
||||
}
|
||||
|
||||
// 添加Scene到World
|
||||
const gameScene = roomWorld.createScene('game', new GameScene());
|
||||
const uiScene = roomWorld.createScene('ui', new UIScene());
|
||||
// 切换场景
|
||||
Core.loadScene(new MenuScene()); // 延迟切换(下一帧)
|
||||
Core.setScene(new GameScene()); // 立即切换
|
||||
|
||||
// 激活Scene
|
||||
roomWorld.setSceneActive('game', true);
|
||||
roomWorld.setSceneActive('ui', true);
|
||||
// 访问当前场景
|
||||
const currentScene = Core.scene;
|
||||
|
||||
// 启动World
|
||||
roomWorld.start();
|
||||
// 使用流式API
|
||||
const player = Core.ecsAPI?.createEntity('Player')
|
||||
.addComponent(Position, 100, 100)
|
||||
.addComponent(Velocity, 50, 0);
|
||||
```
|
||||
|
||||
### World 生命周期
|
||||
### 高级:使用 WorldManager 管理多世界
|
||||
|
||||
World 提供了完整的生命周期管理:
|
||||
- `start()`: 启动 World 和所有全局系统
|
||||
- `updateGlobalSystems()`: 更新全局系统(由 Core.update() 调用)
|
||||
- `updateScenes()`: 更新所有激活的 Scene(由 Core.update() 调用)
|
||||
- `stop()`: 停止 World
|
||||
- `destroy()`: 销毁 World 和所有资源
|
||||
仅适用于复杂的服务器端应用(MMO游戏服务器、游戏房间系统等):
|
||||
|
||||
```typescript
|
||||
import { Core, WorldManager } from '@esengine/ecs-framework';
|
||||
|
||||
// 初始化Core
|
||||
Core.create({ debug: true });
|
||||
|
||||
// 创建世界管理器(手动管理)
|
||||
const worldManager = new WorldManager();
|
||||
|
||||
// 创建多个独立的游戏世界
|
||||
const room1 = worldManager.createWorld('room_001');
|
||||
const room2 = worldManager.createWorld('room_002');
|
||||
|
||||
// 在每个世界中创建场景
|
||||
const gameScene1 = room1.createScene('game', new GameScene());
|
||||
const gameScene2 = room2.createScene('game', new GameScene());
|
||||
|
||||
// 激活场景
|
||||
room1.setSceneActive('game', true);
|
||||
room2.setSceneActive('game', true);
|
||||
|
||||
// 游戏循环(需要手动更新世界)
|
||||
function gameLoop(deltaTime: number) {
|
||||
Core.update(deltaTime); // 更新全局服务
|
||||
worldManager.updateAll(); // 手动更新所有世界
|
||||
}
|
||||
```
|
||||
|
||||
## 与游戏引擎集成
|
||||
|
||||
### Laya 引擎集成
|
||||
|
||||
```typescript
|
||||
import { Stage } from "laya/display/Stage"
|
||||
import { Stat } from "laya/utils/Stat"
|
||||
import { Laya } from "Laya"
|
||||
import { Stage } from "laya/display/Stage";
|
||||
import { Laya } from "Laya";
|
||||
import { Core } from '@esengine/ecs-framework';
|
||||
|
||||
// 初始化 Laya
|
||||
Laya.init(800, 600).then(() => {
|
||||
// 初始化 ECS
|
||||
const core = Core.create(true)
|
||||
|
||||
// 设置场景...
|
||||
Core.create(true);
|
||||
Core.setScene(new GameScene());
|
||||
|
||||
// 启动游戏循环
|
||||
Laya.timer.frameLoop(1, this, () => {
|
||||
const deltaTime = Laya.timer.delta / 1000 // 转换为秒
|
||||
Core.update(deltaTime)
|
||||
})
|
||||
})
|
||||
const deltaTime = Laya.timer.delta / 1000;
|
||||
Core.update(deltaTime); // 自动更新全局服务和场景
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### Cocos Creator 集成
|
||||
|
||||
```typescript
|
||||
import { Component, _decorator } from 'cc'
|
||||
import { Component, _decorator } from 'cc';
|
||||
import { Core } from '@esengine/ecs-framework';
|
||||
|
||||
const { ccclass } = _decorator
|
||||
const { ccclass } = _decorator;
|
||||
|
||||
@ccclass('ECSGameManager')
|
||||
export class ECSGameManager extends Component {
|
||||
|
||||
onLoad() {
|
||||
// 初始化 ECS
|
||||
const core = Core.create(true)
|
||||
|
||||
// 设置场景...
|
||||
Core.create(true);
|
||||
Core.setScene(new GameScene());
|
||||
}
|
||||
|
||||
update(deltaTime: number) {
|
||||
// 更新 ECS
|
||||
Core.update(deltaTime)
|
||||
// 自动更新全局服务和场景
|
||||
Core.update(deltaTime);
|
||||
}
|
||||
|
||||
onDestroy() {
|
||||
// 清理资源
|
||||
Core.destroy();
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -378,7 +401,7 @@ export class ECSGameManager extends Component {
|
||||
|
||||
确保:
|
||||
1. 系统已添加到场景:`this.addSystem(system)` (在 Scene 的 initialize 方法中)
|
||||
2. 场景已设置为当前场景:`Core.setScene(scene)`
|
||||
2. 场景已设置:`Core.setScene(scene)`
|
||||
3. 游戏循环在调用:`Core.update(deltaTime)`
|
||||
|
||||
### 如何调试 ECS 应用?
|
||||
|
||||
@@ -289,12 +289,20 @@ class StatsScene extends Scene {
|
||||
|
||||
## 场景集成到框架
|
||||
|
||||
场景可以通过两种方式运行:
|
||||
ECS Framework 提供了灵活的场景管理架构,适用于不同规模的应用:
|
||||
|
||||
### 1. 简单的单场景应用
|
||||
### 1. 使用 SceneManager(推荐大多数应用)
|
||||
|
||||
适用于 95% 的游戏应用(单人游戏、简单多人游戏、移动游戏等):
|
||||
|
||||
```typescript
|
||||
import { Core } from '@esengine/ecs-framework';
|
||||
import { Core, SceneManager } from '@esengine/ecs-framework';
|
||||
|
||||
// 初始化Core(全局服务)
|
||||
Core.create({ debug: true });
|
||||
|
||||
// 创建场景管理器
|
||||
const sceneManager = new SceneManager();
|
||||
|
||||
// 创建游戏场景
|
||||
class GameScene extends Scene {
|
||||
@@ -305,21 +313,52 @@ class GameScene extends Scene {
|
||||
}
|
||||
}
|
||||
|
||||
// 启动游戏
|
||||
Core.create();
|
||||
// 设置场景
|
||||
const gameScene = new GameScene();
|
||||
Core.setScene(gameScene);
|
||||
sceneManager.setScene(gameScene);
|
||||
|
||||
// 游戏循环
|
||||
function gameLoop(deltaTime: number) {
|
||||
Core.update(deltaTime); // 更新全局服务
|
||||
sceneManager.update(); // 更新当前场景
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 复杂的多场景应用
|
||||
### 2. 场景切换
|
||||
|
||||
SceneManager 支持流畅的场景切换:
|
||||
|
||||
```typescript
|
||||
import { WorldManager } from '@esengine/ecs-framework';
|
||||
// 立即切换场景
|
||||
const menuScene = new MenuScene();
|
||||
sceneManager.setScene(menuScene);
|
||||
|
||||
// 获取WorldManager实例
|
||||
const worldManager = WorldManager.getInstance();
|
||||
// 延迟切换场景(在下一帧切换)
|
||||
const gameScene = new GameScene();
|
||||
sceneManager.startSceneTransition(gameScene, false);
|
||||
|
||||
// 创建World
|
||||
// 访问当前场景
|
||||
const currentScene = sceneManager.currentScene;
|
||||
|
||||
// 访问 ECS API
|
||||
const ecsAPI = sceneManager.ecsAPI;
|
||||
const entity = ecsAPI?.createEntity('player');
|
||||
```
|
||||
|
||||
### 3. 使用 WorldManager(高级用例)
|
||||
|
||||
适用于需要完全隔离的多世界应用(MMO服务器、游戏房间系统等):
|
||||
|
||||
```typescript
|
||||
import { Core, WorldManager } from '@esengine/ecs-framework';
|
||||
|
||||
// 初始化Core(全局服务)
|
||||
Core.create({ debug: true });
|
||||
|
||||
// 创建世界管理器
|
||||
const worldManager = new WorldManager();
|
||||
|
||||
// 创建多个独立的游戏世界
|
||||
const gameWorld = worldManager.createWorld('game', {
|
||||
name: 'MainGame',
|
||||
maxScenes: 5
|
||||
@@ -331,6 +370,12 @@ const gameScene = gameWorld.createScene('game', new GameScene());
|
||||
|
||||
// 激活场景
|
||||
gameWorld.setSceneActive('menu', true);
|
||||
|
||||
// 游戏循环
|
||||
function gameLoop(deltaTime: number) {
|
||||
Core.update(deltaTime); // 更新全局服务
|
||||
worldManager.updateAll(); // 更新所有世界
|
||||
}
|
||||
```
|
||||
|
||||
## 多场景管理
|
||||
@@ -376,21 +421,43 @@ class GameWorld extends World {
|
||||
}
|
||||
```
|
||||
|
||||
## 与 World 的关系
|
||||
## 架构层次
|
||||
|
||||
Scene 的运行架构层次:
|
||||
ECS Framework 的架构层次清晰,职责分明:
|
||||
|
||||
```typescript
|
||||
// Core -> WorldManager -> World -> Scene -> EntitySystem -> Entity -> Component
|
||||
// 架构层次:
|
||||
// Core (全局服务) → SceneManager (场景管理) → Scene → EntitySystem → Entity → Component
|
||||
// 或
|
||||
// Core (全局服务) → WorldManager (世界管理) → World → Scene → EntitySystem → Entity → Component
|
||||
|
||||
// 1. 简单应用:Core直接管理单个Scene
|
||||
Core.setScene(new GameScene());
|
||||
// 1. 推荐:使用 SceneManager 管理单场景/场景切换
|
||||
import { Core, SceneManager } from '@esengine/ecs-framework';
|
||||
|
||||
// 2. 复杂应用:WorldManager管理多个World,每个World管理多个Scene
|
||||
const worldManager = WorldManager.getInstance();
|
||||
Core.create({ debug: true });
|
||||
const sceneManager = new SceneManager();
|
||||
sceneManager.setScene(new GameScene());
|
||||
|
||||
// 游戏循环
|
||||
function gameLoop(deltaTime: number) {
|
||||
Core.update(deltaTime); // 全局服务
|
||||
sceneManager.update(); // 场景更新
|
||||
}
|
||||
|
||||
// 2. 高级:使用 WorldManager 管理多世界
|
||||
import { Core, WorldManager } from '@esengine/ecs-framework';
|
||||
|
||||
Core.create({ debug: true });
|
||||
const worldManager = new WorldManager();
|
||||
const world = worldManager.createWorld('gameWorld');
|
||||
const scene = world.createScene('mainScene', new GameScene());
|
||||
world.setSceneActive('mainScene', true);
|
||||
|
||||
// 游戏循环
|
||||
function gameLoop(deltaTime: number) {
|
||||
Core.update(deltaTime); // 全局服务
|
||||
worldManager.updateAll(); // 所有世界更新
|
||||
}
|
||||
```
|
||||
|
||||
## 最佳实践
|
||||
|
||||
Reference in New Issue
Block a user