// ENGINE · FINGERENGINE
FingerEngine 游戏引擎
基于 Cocos Creator 3.8.8 深度封装的轻量级小游戏引擎,将多年研发沉淀提炼成清晰、可测试、AI 友好的开发底座。 一套代码,覆盖微信、抖音、快手、App 与 Web。
// OVERVIEW
我们为什么自研引擎
小游戏研发的痛点不是「写不出玩法」,而是每次项目都重复造轮子: 平台差异、资源管线、热更新、联机同步、UI 绑定…… 每一个都足以让团队陷入泥潭。
FingerEngine 把 Cocos Creator 的能力折叠成一套可复用的架构, 让策划、程序、美术在一个稳定的底座上并行推进,把精力留给玩法本身。
- ▍实体-组件-系统(ECS)组合式架构,逻辑与表现解耦
- ▍MVVM 驱动 UI 层,数据绑定开箱即用
- ▍热更新与远程资源管线,迭代不等待审核
- ▍帧同步 / 状态同步双模式,对战游戏开箱即用
- ▍完整 JSDoc,AI 友好的类型安全开发体验
import { FingerEngine } from 'finger-engine';
const app = new FingerEngine({
platforms: ['wechat', 'douyin', 'web'],
scene: 'MainMenu',
hotUpdate: true,
});
app.launch(() => {
ui.open('views/LoginView');
res.load('main_atlas');
net.connect('ws://game.joyfinger.cn');
});▍
// ARCHITECTURE
清晰的分层架构
从纯 TypeScript 核心到 Cocos 运行时,每一层职责单一、可独立测试。
核心层 · 纯 TS
ECS、网络协议、行为树、事件总线、随机数系统、定时器系统,全部与引擎无关,可在 Node 环境单元测试。
Cocos 适配层
将 Cocos Creator 3.8.8 能力封装为稳定接口:场景管理、组件生命周期、@ccclass 序列化与加载。
MVVM UI 层
数据驱动界面,viewModel 与视图自动双向绑定,弹窗、通知、界面栈统一管理。
资源与热更新管线
基于 Asset Manager 的加载、缓存、压缩与远程热更,版本迭代无需发版等待。
网络与同步层
WebSocket / HTTP 封装,帧同步与状态同步双模式,断线重连与协议压缩内建。
工具与性能层
性能剖析、日志分级、对象池、批量渲染调度,中低端机型同样保持流畅。
// FEATURES
核心特性详解
每一条能力都来自真实项目的血泪沉淀,开箱即用。
多端一键发布
一份代码同时构建微信、抖音、快手、App 与 Web。自动处理平台差异、分包策略、平台登录与支付 SDK 对接,构建即发布,无需逐个平台人工适配。
ECS 组合式架构
实体-组件-系统三层解耦:系统专注逻辑,组件承载数据,实体自由组合能力。配合对象池与命令缓冲,千人同屏的复杂玩法也能保持清晰与高性能。
热更新与资源管线
基于 Cocos Asset Manager 强化资源加载、图集合批与远程热更。版本迭代、活动上线不再等待平台审核,灰度发布与回滚一气呵成。
高性能渲染
适配 WebGL / WebGPU 渲染管线,2D 批处理与特效系统深度优化。粒子、战斗特效、大世界场景在中低端机型同样丝滑。
网络与联机同步
WebSocket / HTTP 协议层封装,内置帧同步、状态同步双模式。断线重连、弱网补偿、协议压缩内建,对战与休闲游戏开箱即用。
工具链与调试
内置性能剖析、日志分级与强制类型检查。完整 JSDoc 覆盖每一个公共接口,AI 也能轻松理解并生成符合规范的代码。
// CODE
开箱即用的开发体验
以最少的样板代码,表达最清晰的逻辑。
import { Comp, Entity, System } from 'finger-engine';
class MoveData extends Comp {
speed: number = 120;
}
class MoveSystem extends System {
update(dt: number) {
this.allOf(MoveData).forEach(e => {
const pos = e.get(PosData);
pos.x += e.get(MoveData).speed * dt;
});
}
}
import { viewModel, Bindable } from 'finger-engine';
@viewModel
class HUDModel {
@Bindable score = 0;
@Bindable combo = 0;
}
// 视图自动更新,无需手动 set
hud.data.score += 100;
hud.data.combo = 3;