Files
esengine/COCOS_USAGE.md

259 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Cocos Creator 使用指南
本指南专门针对在 Cocos Creator 3.8+ 中使用 @esengine/ecs-framework。
## 安装
```bash
npm install @esengine/ecs-framework
```
## 重要说明
⚠️ **Cocos Creator 环境下无法直接使用 WASM 加速**
由于 Cocos Creator 的特殊 WASM 加载机制,框架会自动检测 Cocos 环境并回退到 JavaScript 实现。这不会影响功能,只是性能稍有差异。
## 基本使用
### 1. 创建 ECS 核心
```typescript
import { Core } from '@esengine/ecs-framework';
// 在Cocos组件中初始化
export class GameManager extends Component {
private core: Core;
onLoad() {
// 创建核心实例Cocos环境会自动禁用WASM
this.core = Core.create(true);
console.log('ECS核心已初始化');
}
}
```
### 2. 创建组件
```typescript
import { Component } from '@esengine/ecs-framework';
// 位置组件
export class Position extends Component {
constructor(public x: number = 0, public y: number = 0) {
super();
}
}
// 速度组件
export class Velocity extends Component {
constructor(public dx: number = 0, public dy: number = 0) {
super();
}
}
// 精灵组件关联Cocos节点
export class SpriteComponent extends Component {
constructor(public node: Node) {
super();
}
}
```
### 3. 创建系统
```typescript
import { EntitySystem, Family } from '@esengine/ecs-framework';
export class MovementSystem extends EntitySystem {
constructor() {
super(Family.all(Position, Velocity).get());
}
public processEntity(entity: Entity, deltaTime: number): void {
const pos = entity.getComponent(Position);
const vel = entity.getComponent(Velocity);
pos.x += vel.dx * deltaTime;
pos.y += vel.dy * deltaTime;
}
}
export class SpriteRenderSystem extends EntitySystem {
constructor() {
super(Family.all(Position, SpriteComponent).get());
}
public processEntity(entity: Entity, deltaTime: number): void {
const pos = entity.getComponent(Position);
const sprite = entity.getComponent(SpriteComponent);
// 同步位置到Cocos节点
sprite.node.setPosition(pos.x, pos.y);
}
}
```
### 4. 创建场景
```typescript
import { Scene } from '@esengine/ecs-framework';
export class GameScene extends Scene {
private movementSystem: MovementSystem;
private spriteRenderSystem: SpriteRenderSystem;
public initialize(): void {
// 添加系统
this.movementSystem = this.addEntityProcessor(new MovementSystem());
this.spriteRenderSystem = this.addEntityProcessor(new SpriteRenderSystem());
// 创建一些实体用于测试
this.createTestEntities();
}
private createTestEntities(): void {
for (let i = 0; i < 10; i++) {
const entity = this.createEntity();
// 添加位置组件
entity.addComponent(new Position(
Math.random() * 800,
Math.random() * 600
));
// 添加速度组件
entity.addComponent(new Velocity(
(Math.random() - 0.5) * 200,
(Math.random() - 0.5) * 200
));
// 创建Cocos节点并添加精灵组件
const node = new Node();
const sprite = node.addComponent(Sprite);
// 设置精灵贴图...
entity.addComponent(new SpriteComponent(node));
}
}
}
```
### 5. 在Cocos组件中集成
```typescript
import { Component, _decorator } from 'cc';
import { Core } from '@esengine/ecs-framework';
const { ccclass } = _decorator;
@ccclass('ECSGameManager')
export class ECSGameManager extends Component {
private core: Core;
private gameScene: GameScene;
onLoad() {
// 初始化ECS核心
this.core = Core.create(true);
// 创建游戏场景
this.gameScene = new GameScene();
Core.scene = this.gameScene;
console.log('ECS系统已启动');
}
update(deltaTime: number) {
// ECS系统会自动处理更新
// Core.emitter 会自动触发 frameUpdated 事件
}
onDestroy() {
// 清理资源
if (this.core) {
// 执行必要的清理
}
}
}
```
## 高级功能
### 事件系统
```typescript
import { EventBus, ECSEventType } from '@esengine/ecs-framework';
// 监听实体创建事件
EventBus.subscribe(ECSEventType.EntityCreated, (data) => {
console.log('实体已创建:', data.entityId);
});
// 发射自定义事件
EventBus.emit('player-scored', { score: 100, playerId: 'player1' });
```
### 性能监控
```typescript
import { PerformanceMonitor } from '@esengine/ecs-framework';
// 获取性能统计
const stats = PerformanceMonitor.instance.getStats();
console.log('系统性能:', stats);
```
### 对象池
```typescript
import { PoolManager } from '@esengine/ecs-framework';
// 获取对象池管理器
const poolManager = PoolManager.getInstance();
// 创建对象池
const bulletPool = poolManager.createPool('bullets', () => new BulletComponent(), 100);
// 获取对象
const bullet = bulletPool.obtain();
// 归还对象
bulletPool.free(bullet);
```
## 性能建议
1. **合理使用Family查询**: 避免过于复杂的组件查询
2. **批量操作**: 使用事件系统进行批量更新
3. **对象池**: 频繁创建/销毁的对象使用对象池
4. **定期清理**: 及时移除不需要的实体和组件
## 注意事项
1. 🔧 **WASM 支持**: 在 Cocos Creator 中自动禁用,使用 JavaScript 实现
2. 🎯 **内存管理**: 注意及时清理不需要的实体,避免内存泄漏
3. 🔄 **更新循环**: ECS 系统会自动集成到 Cocos 的更新循环中
4. 📦 **模块化**: 建议按功能拆分不同的系统和组件
## 故障排除
### 常见问题
**Q: 为什么看到"检测到Cocos Creator环境WASM需要手动配置"的警告?**
A: 这是正常的。框架会自动回退到JavaScript实现功能完全正常。
**Q: 如何确认ECS系统正在运行**
A: 查看控制台输出,应该能看到"ECS核心已初始化"等日志。
**Q: 性能是否受到影响?**
A: JavaScript实现的性能已经很好对于大多数游戏场景足够使用。
## 示例项目
完整的示例项目请参考:[GitHub示例仓库](https://github.com/esengine/ecs-framework/tree/master/examples/cocos)
## 技术支持
如遇问题,请访问:
- [GitHub Issues](https://github.com/esengine/ecs-framework/issues)
- [官方文档](https://github.com/esengine/ecs-framework#readme)