# 挂机类手游技术栈方案(开源可商用) > 版本:1.2 > 日期:2026-06-29 > 适用平台:Android、iOS、鸿蒙(HarmonyOS NEXT) > 核心约束:所有组件必须开源且可商用,无 SSPL / BSL / RSAL 等限制性许可证 --- ## 一、许可证基准说明 本方案所有组件须满足以下许可证之一: | 许可证 | 商用限制 | |--------|----------| | MIT | 无 | | Apache 2.0 | 无 | | BSD 2/3-Clause | 无 | | PostgreSQL License | 无(类 MIT) | | MPL 2.0 | 修改须开源,独立使用无限制 | | Cocos 商业免费协议 | 商用免费,无运行时抽成 | **明确规避**:SSPL(MongoDB、Redis 7.4+)、BSL(HashiCorp Consul)、RSAL(Redis 7.4+)、Unity Runtime Fee。 --- ## 二、客户端技术栈 ### 2.1 游戏引擎 **选型:Cocos Creator 3.x** | 项目 | 说明 | |------|------| | 许可证 | Cocos 商业免费协议,无运行时抽成 | | Android | 原生导出,支持 APK / AAB | | iOS | 原生导出,支持 App Store 上架 | | 鸿蒙 NEXT | 官方支持导出 ArkTS 工程,支持 AppGallery 上架 | | 开发语言 | TypeScript | | 渲染 | OpenGL ES / Metal / Vulkan(Canvas 渲染,非 WebView) | | 热更新 | 官方内置 Asset Bundle 热更,JS/TS 代码 + 资源均可热更,无需发版 | **选型理由**:当前版本采用文字战报战斗模式(后续动画版本单独立项),需要频繁热更新活动玩法和战报文案,Cocos Creator Asset Bundle 热更机制成熟,官方支持鸿蒙 NEXT,是当前需求下最合适的组合。 ### 2.2 客户端核心模块 ``` ├── UI 框架 Cocos Creator 内置 UI 系统(Canvas + Widget + Layout) ├── 场景渲染 2.5D 场景地图(TileMap + 层级遮挡) ├── 角色立绘 静态立绘 / 头像(按种族区分,无骨骼动画,当前版本) ├── 战斗战报 文字战报 UI(回合日志 + 血量条动画 + 高亮事件) ├── 资源管理 AssetManager(Bundle 分包 + 远程加载 + 版本管理) ├── 热更新 Asset Bundle 热更(差异包 + MD5 校验 + 回滚支持) │ 战报文案、活动配置、场景资源均可热更,无需发版 ├── 网络层 WebSocket(引擎内置)+ protobufjs(BSD,二进制协议) ├── HTTP 引擎内置 + axios 风格封装 ├── 本地存储 sys.localStorage(引擎封装) ├── 音频 AudioManager(引擎内置) ├── 多语言 i18next(MIT) └── 活动小程序 内嵌 WebView 组件加载 H5 活动页(按需热更) ``` > **后续动画版本**:当前版本无骨骼动画,角色以静态立绘展示。动画版本(Spine 骨骼动画)作为后续独立迭代项目,核心玩法验证完成后再立项,通过 Asset Bundle 热更上线,不需要重新发版。 ### 2.3 热更新方案 | 更新类型 | 机制 | 是否需要发版 | |----------|------|-------------| | 数值配置(掉落表、技能参数) | 服务端 JSON 下发,客户端启动时拉取 | 否 | | 活动玩法 UI + 逻辑 | Asset Bundle 热更,CDN 分发差异包 | 否 | | 小程序式活动 | WebView 加载 H5,完全绕过商店审核 | 否 | | 引擎底层 / 原生插件变更 | 商店发版 | 是(必须) | ``` 热更流程: 客户端启动 → 请求版本接口 → 比对本地 manifest → 有差异 → 下载差异 Bundle → 校验 MD5 → 加载新 Bundle → 无差异 → 直接进入游戏 ``` ### 2.4 三端差异处理 | 能力 | Android | iOS | 鸿蒙 NEXT | |------|---------|-----|-----------| | 推送 | FCM(免费) | APNs(免费) | 华为 Push Kit(免费) | | 支付 | Google Play Billing | App Store IAP | 华为 IAP | | 登录 | Google One Tap / 自建 | Sign in with Apple / 自建 | 华为 Account Kit / 自建 | | 权限配置 | AndroidManifest | Info.plist | module.json5 | | 热更新 | Asset Bundle | Asset Bundle | Asset Bundle(官方支持) | --- ## 三、服务端技术栈 ### 3.1 游戏服务器框架 **选型:Nakama(Apache 2.0)** | 项目 | 说明 | |------|------| | 许可证 | Apache 2.0,完全可商用 | | 开发语言 | Go(服务端核心)+ Lua / TypeScript(自定义逻辑) | | 内置能力 | 用户系统、排行榜、好友、邮件、实时对战、存储、RPC | | 开服支持 | 无状态设计,Docker 容器化后可无限横向扩展 | | 协议 | WebSocket + Protobuf / JSON | **备选:Pitaya(MIT)** | 项目 | 说明 | |------|------| | 许可证 | MIT | | 来源 | 网易开源 | | 特点 | 分布式集群架构,原生支持分区分服,etcd 服务发现 | | 适用场景 | 对集群拓扑控制要求更高时选用 | ### 3.2 HTTP API 服务 ``` 语言:Go 框架:Gin(MIT) 用途:GM 后台接口、支付回调、第三方登录验证、运营活动接口 ``` ### 3.3 数据层 #### 关系型数据库:PostgreSQL 16 | 项目 | 说明 | |------|------| | 许可证 | PostgreSQL License(类 MIT,完全可商用) | | 用途 | 角色数据、装备、进度、订单、境界配置 | | 扩展 | pg_partman 分区(MIT)、pgvector(MIT) | #### 缓存 / 排行榜:Valkey 8.x | 项目 | 说明 | |------|------| | 许可证 | BSD 3-Clause | | 来源 | Linux 基金会主导的 Redis 官方 fork,规避 Redis 7.4+ 的 RSAL+SSPL 问题 | | 用途 | 在线状态、Session、离线收益缓存、境界排行榜(Sorted Set)、分布式锁 | #### 日志 / 非结构化数据 使用 PostgreSQL JSONB,规避 MongoDB SSPL: ```sql CREATE TABLE game_logs ( id BIGSERIAL PRIMARY KEY, player_id BIGINT NOT NULL, event_type VARCHAR(64) NOT NULL, payload JSONB, created_at TIMESTAMPTZ DEFAULT NOW() ); CREATE INDEX ON game_logs USING GIN (payload); ``` ### 3.4 消息队列 **选型:Apache Kafka(Apache 2.0)** | 用途 | 说明 | |------|------| | 跨境界活动广播 | 全服推送活动开启 / 关闭事件 | | 飞升 / 回下界事件 | 异步处理境界迁移,解耦主流程 | | 离线收益结算 | 玩家下线时异步计算,上线时消费 | | 日志收集 | 行为日志异步写入 | **轻量备选:NATS(Apache 2.0)**,适合服务内部低延迟通信。 ### 3.5 服务治理 | 组件 | 选型 | 许可证 | 用途 | |------|------|--------|------| | 配置中心 | Nacos 2.x | Apache 2.0 | 境界配置下发、动态开关 | | 服务注册 | Nacos 2.x | Apache 2.0 | 服务实例自动注册发现 | | 网关 | OpenResty(Nginx + LuaJIT) | BSD | SSL 终止、路由、限流 | | 备选网关 | Traefik v3 | MIT | K8s 环境下动态路由 | --- ## 四、开服自动化方案 ### 4.1 容器化 ``` game-server:latest # Nakama 游戏逻辑服 api-server:latest # Gin HTTP API 服 gm-backend:latest # GM 后台服务 ``` ### 4.2 Helm Chart 模板化 ```yaml # charts/game-server/values.yaml serverId: 101 serverName: "天元界" db: host: pg.internal schema: server_101 valkey: keyPrefix: "s101:" nacos: group: GAME_SERVER dataId: server-101 ``` 开新服只需一条命令: ```bash helm install game-server-s102 ./charts/game-server \ --set serverId=102 \ --set serverName="苍穹界" \ --set db.schema=server_102 ``` ### 4.3 CI/CD 流水线 ``` 代码推送 → Gitea(MIT) ↓ Jenkins(MIT)触发构建 ↓ Docker 镜像构建 & 推送至 Harbor(Apache 2.0) ↓ Helm upgrade --install 部署至 K8s ↓ Nacos 自动注册新服信息 ↓ 客户端服务器列表更新 ``` ### 4.4 开服流程时序 ``` 运营后台点击"开新服" → 调用 GM API → Jenkins Job 触发(参数:服务器编号、名称、开放时间) → 创建 PostgreSQL Schema + 初始化表结构 + 初始化境界数据 → Helm install 拉起服务器容器 → Nacos 注册服务器信息(状态=待开放) → 定时任务到达开放时间 → 状态改为 open → 客户端轮询 Nacos,自动显示新服 ``` --- ## 五、境界隔离系统设计 ### 5.1 设计概述 游戏对外表现为单服务器,所有玩家在同一逻辑空间内,但按修炼境界划分竞争池。玩家只能看到、交互、竞争同境界的其他玩家,感知不到其他境界的存在。达到条件后可永久飞升上界;上界玩家可消耗代价临时回下界。 ``` 凡人界(Tier 1)→ 炼气界(Tier 2)→ 筑基界(Tier 3)→ 金丹界(Tier 4)→ 元婴界 / 上界(Tier 5) 新手区 顶级玩家区 ``` ### 5.2 数据模型 ```sql -- 境界配置表 CREATE TABLE realm_tiers ( tier SMALLINT PRIMARY KEY, name VARCHAR(32) NOT NULL, -- 凡人界、炼气界... ascend_min_level INT NOT NULL, -- 飞升所需最低等级 ascend_min_power BIGINT NOT NULL, -- 飞升所需最低战力 ascend_cost JSONB NOT NULL, -- {"item_id":1001,"count":10} descend_cost JSONB, -- {"item_id":2001,"count":1},NULL 表示不可回下界 descend_duration INTERVAL DEFAULT '24 hours' -- 临时下界持续时长 ); -- 玩家核心字段(附加到 players 表) ALTER TABLE players ADD COLUMN realm_tier SMALLINT NOT NULL DEFAULT 1; -- 归属境界(永久) ALTER TABLE players ADD COLUMN current_realm SMALLINT NOT NULL DEFAULT 1; -- 当前所在境界 ALTER TABLE players ADD COLUMN descend_expires TIMESTAMPTZ; -- 临时回下界到期,NULL=未回下界 ``` **字段说明**: - `realm_tier`:玩家真实所属境界,飞升后永久改变,不随临时下界变化 - `current_realm`:玩家当前实际所在境界,决定能看到哪些排行榜、聊天、玩家 - `descend_expires`:临时下界到期时间,到期后自动迁回 `realm_tier` ### 5.3 境界隔离查询规则 所有涉及玩家互动的查询均以 `current_realm` 过滤: ```sql -- 境界排行榜(临时下界的上界玩家不参与本界排名) SELECT id, name, power FROM players WHERE current_realm = $1 AND realm_tier = $1 -- 排除临时下界的高境界玩家 ORDER BY power DESC LIMIT 100; -- 境界内玩家列表(含临时下界的访客) SELECT id, name, realm_tier, current_realm FROM players WHERE current_realm = $1; -- 匹配系统:PVP 只在同 realm_tier 之间匹配 SELECT id, name, power FROM players WHERE realm_tier = $1 -- 按真实境界匹配,防止回下界玩家刷分 AND current_realm = $1 ORDER BY ABS(power - $2) -- 最近战力优先 LIMIT 10; ``` ### 5.4 Valkey 缓存结构 ``` realm:{tier}:rank Sorted Set 境界排行榜,score = 战力 realm:{tier}:online Set 境界在线玩家 ID realm:{tier}:chat:world Stream 境界世界频道 realm:{tier}:chat:system Stream 系统公告 player:{id}:realm String 玩家当前境界(网关路由用,低延迟读取) descend:expire:{id} String+TTL 临时下界到期标记,TTL 到期触发回上界检测 ``` ### 5.5 飞升流程 ``` 客户端发起飞升申请 ↓ 服务端校验:等级 ≥ ascend_min_level AND 战力 ≥ ascend_min_power AND 持有飞升道具 ↓(校验通过) 扣除飞升道具 ↓ BEGIN TRANSACTION UPDATE players SET realm_tier = tier+1, current_realm = tier+1 WHERE id = $id INSERT INTO ascension_log (player_id, from_tier, to_tier, ascended_at) VALUES (...) COMMIT ↓ 清除旧境界缓存(排行榜、在线列表) 初始化新境界缓存(加入新境界排行榜 Sorted Set) ↓ Kafka 发布 ascension 事件 → 全服广播"XXX 飞升上界" ↓ 客户端收到响应,进入上界场景 ``` ### 5.6 临时回下界流程 ``` 上界玩家申请回下界(选择目标境界 target_tier < realm_tier) ↓ 服务端校验:持有下界令 AND realm_tiers[target_tier].descend_cost 不为 NULL ↓(校验通过) 扣除下界令 ↓ BEGIN TRANSACTION UPDATE players SET current_realm = target_tier, descend_expires = NOW() + descend_duration WHERE id = $id COMMIT ↓ Valkey 写入 descend:expire:{id},TTL = descend_duration 加入目标境界在线列表(不加入排行榜、不参与 PVP 匹配) ↓ 属性封印生效:战力压制到 target_tier 天花板,上界专属技能禁用 客户端显示"仙人下凡"标识 ``` **临时下界的行为限制:** | 行为 | 是否允许 | 说明 | |------|----------|------| | 查看下界好友 / 聊天 | ✅ | 主要使用场景 | | 购买下界交易行物品 | ✅ | 不影响市场均衡(只买不卖) | | 帮助帮派任务 | ✅ | 有助于活跃帮派 | | 参与下界 PVP 匹配 | ❌ | 防止破坏下界战力平衡 | | 参与下界排行榜 | ❌ | 不纳入 realm_tier = target 的排行计算 | | 占领下界资源点 | ❌ | 防止垄断 | | 使用上界专属技能 | ❌ | 属性封印 | | 在下界交易行出售物品 | ❌ | 防止上界物资流入扰乱经济 | ### 5.7 到期自动回上界 ``` 方案 A(推荐):Valkey keyspace 通知 配置 notify-keyspace-events Ex 监听 descend:expire:{id} 的 expired 事件 → 触发回上界逻辑 → UPDATE players SET current_realm = realm_tier, descend_expires = NULL → 更新缓存 方案 B:定时扫描兜底(与 A 并用) 每 60 秒扫描 descend_expires < NOW() 的玩家 执行回上界逻辑(处理 keyspace 通知漏掉的边界情况) ``` ### 5.8 服务器压力评估 境界隔离是**数据过滤层**,不引入新的计算量,服务器压力与传统分服相当: | 维度 | 影响 | 说明 | |------|------|------| | 数据库查询 | 无显著增加 | WHERE 多一个 current_realm 条件,走索引 | | 排行榜计算 | 无显著增加 | 每境界独立 Sorted Set,与传统分区排行榜相同 | | 在线人数 | 按境界均摊 | 5 境界 × N 玩家 ≈ N/5 玩家/境界,单境界压力低于全服汇聚 | | 临时下界玩家 | 极低 | 消耗代价门槛高,占比极少,双态逻辑复杂度可控 | | 跨境界全局活动 | 需设计 | 限制频率(如每天 1 次),聚合查询走只读副本 | **水平扩容策略(玩家量大时):** ``` 按境界分片部署,对外仍是单服感知: Tier 1-2 → 实例组 A(新手多,需要更多资源) Tier 3-4 → 实例组 B Tier 5 → 实例组 C(顶级玩家,高活跃) 路由层(OpenResty)根据 player:{id}:realm 缓存值分发请求 ``` --- ## 六、GM 后台 & 运营平台 ### 6.1 技术选型 | 层 | 选型 | 许可证 | |----|------|--------| | 前端框架 | Vue 3 | MIT | | UI 组件库 | Naive UI | MIT | | 图表 | Apache ECharts | Apache 2.0 | | 后端框架 | Gin(Go) | MIT | | 认证 | JWT(golang-jwt,MIT) | MIT | | 权限模型 | Casbin RBAC | Apache 2.0 | ### 6.2 GM 后台核心功能 ``` ├── 服务器管理 开服 / 停服 / 合服操作 ├── 境界管理 调整境界参数、飞升条件、下界代价 ├── 玩家管理 封禁、补偿道具、强制迁移境界、重置密码 ├── 活动管理 全服 / 跨境界活动配置,热更新活动 Bundle ├── 公告系统 全服公告、境界内公告、维护公告 ├── 邮件系统 全服邮件、境界邮件、定向邮件 ├── 数据报表 DAU / 付费 / 在线人数 / 各境界人口分布 └── 日志查询 玩家行为日志、飞升记录、下界记录检索 ``` --- ## 七、数据分析 & 埋点 **选型:Apache Superset(Apache 2.0)+ 自建埋点** | 组件 | 说明 | |------|------| | 埋点上报 | 客户端 HTTP 上报至 Kafka,异步落库 PostgreSQL | | 数据可视化 | Apache Superset(Apache 2.0)连接 PostgreSQL | | 实时大盘 | Grafana(AGPL v3,自用可商用)+ PostgreSQL 数据源 | | 境界分析 | 各境界玩家留存、飞升转化率、回下界频次等核心指标 | --- ## 八、安全方案 ### 8.1 反作弊 ``` 离线收益校验 服务端计算最大离线收益上限,客户端提交值超限则截断 时间防篡改 使用服务端时间戳,客户端时间仅用于 UI 展示 协议加签 每个请求携带 HMAC-SHA256 签名(密钥存服务端) 速率限制 OpenResty 限流,防刷接口 境界校验 飞升 / 回下界操作全部服务端二次校验,客户端申请不可信 ``` ### 8.2 数据安全 ``` 传输加密 全链路 HTTPS / WSS(TLS 1.3) 存储加密 敏感字段 AES-256 加密存储 数据库 PostgreSQL 行级安全策略(RLS),境界数据按 realm_tier 行隔离 ``` --- ## 九、完整架构图 ``` ┌──────────────────────────────────────────────────────┐ │ 客户端(Cocos Creator 3.x) │ │ Android │ iOS │ HarmonyOS NEXT │ │ Asset Bundle 热更 │ WebView 小程序活动 │ └───────────────────────┬──────────────────────────────┘ │ WebSocket + Protobuf / HTTPS ▼ ┌──────────────────────────────────────────────────────┐ │ OpenResty / Traefik 网关层 │ │ SSL 终止 │ 路由(按 player:realm 分发)│ 限流 │ └──────┬───────────────────────────────────────────────┘ │ ├──────────────────────────┐ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ │ 游戏逻辑服 │ │ 游戏逻辑服 │ ... 按境界或按量扩展 │ Nakama │ │ Nakama │ │ (Docker) │ │ (Docker) │ └────────┬────────┘ └────────┬────────┘ │ │ ▼ ▼ ┌──────────────────────────────────────────────────────┐ │ 数据层 │ │ PostgreSQL(players.current_realm 境界隔离) │ │ Valkey(realm:{tier}:rank / online / chat) │ └───────────────────────┬──────────────────────────────┘ │ ┌──────────────┼──────────────────┐ ▼ ▼ ▼ ┌───────────┐ ┌───────────┐ ┌──────────────┐ │ Kafka │ │ Nacos │ │ Gin API 服 │ │ 消息队列 │ │ 配置中心 │ │ GM 后台接口 │ │ 飞升事件 │ │ 境界参数 │ │ 支付回调 │ └───────────┘ └───────────┘ └──────┬───────┘ │ ┌───────▼────────┐ │ GM 后台 │ │ Vue3 + ECharts │ └────────────────┘ Jenkins + Gitea + Helm + Harbor CI/CD 自动化开服 ``` --- ## 十、组件清单与许可证汇总 | 组件 | 版本 | 许可证 | 用途 | |------|------|--------|------| | Cocos Creator | 3.x | Cocos 商业免费 | 客户端引擎 + 热更新 | | protobufjs | latest | BSD | 客户端协议序列化 | | i18next | latest | MIT | 多语言 | | Nakama | 3.x | Apache 2.0 | 游戏服务器 | | Pitaya | latest | MIT | 备选游戏服务器 | | Go | 1.22+ | BSD | 服务端语言 | | Gin | latest | MIT | HTTP 框架 | | PostgreSQL | 16 | PostgreSQL License | 主数据库(境界数据) | | Valkey | 8.x | BSD 3-Clause | 缓存 / 境界排行榜 | | Apache Kafka | 3.x | Apache 2.0 | 消息队列(飞升事件等) | | NATS | 2.x | Apache 2.0 | 轻量消息(服务内部) | | Nacos | 2.x | Apache 2.0 | 配置 & 注册中心 | | OpenResty | latest | BSD | 网关(境界路由) | | Traefik | v3 | MIT | 备选网关 | | Docker (Moby) | latest | Apache 2.0 | 容器化 | | Kubernetes | 1.30+ | Apache 2.0 | 容器编排 | | Helm | 3.x | Apache 2.0 | 服务器模板化 | | Harbor | 2.x | Apache 2.0 | 私有镜像仓库 | | Jenkins | 2.x | MIT | CI/CD | | Gitea | 1.x | MIT | Git 服务 | | Vue 3 | latest | MIT | GM 后台前端 | | Naive UI | latest | MIT | UI 组件库 | | Apache ECharts | 5.x | Apache 2.0 | 图表 | | Casbin | latest | Apache 2.0 | 权限控制 | | Apache Superset | latest | Apache 2.0 | 数据分析 | | Grafana | latest | AGPL v3 | 监控大盘(自用) | --- ## 十一、需规避的方案 | 组件 | 问题 | 替代方案 | |------|------|----------| | Redis 7.4+ | RSAL + SSPL,商用受限 | Valkey(BSD) | | MongoDB | SSPL,SaaS 场景受限 | PostgreSQL JSONB | | HashiCorp Consul | BSL 1.1,竞品限制 | Nacos(Apache 2.0) | | Unity | 运行时收费条款 | Cocos Creator(商业免费) | | Flutter | AOT 编译不支持热更新,活动玩法无法绕过发版 | Cocos Creator(Asset Bundle 热更) | | Vue3 + Capacitor | WebView 渲染,不适合游戏场景 | Cocos Creator(Canvas 渲染) | | Elasticsearch | SSPL | PostgreSQL 全文检索 / OpenSearch(Apache 2.0) | --- *文档生成时间:2026-06-29 | 最后更新:2026-06-29(v1.2 客户端改回 Cocos Creator,新增境界隔离系统设计)*