构建怪物捕捉 MMORPG
PokeMMO 证明了玩家想要一个持久的在线世界,在其中捕捉、战斗、交易和社交。从零开始构建这样的体验,花了 PokeMMO 团队十多年的开发时间。


频道条、附近玩家数量和延迟徽章并不是示意图:那是 连接到 Nakama 服务器的客户端,而下面的 Hub 选项卡就是你把它指向你自己服务器的地方。
OpenMon 的 Pro、Source 和 Studio 版本包含 25 个集成服务,为怪物捕捉 MMO 提供后端 —— 由 Nakama 驱动,这是一款全球各地工作室都在使用的开源游戏服务器。
适用于 Pro、Source 和 Studio 版本。
你能得到什么
Pro 版本为 OpenMon 的单人引擎扩展了多人后端。每个服务都是 NakamaManager.Instance 的公共属性,并且每个都有自己的指南:
| 模块 | 服务(NakamaManager 的属性) | 指南 |
|---|---|---|
| 认证 | Auth、SessionMgr -- 邮箱、设备和 SSO(Discord、Google、Apple)登录,带会话持久化和自动重连 | 认证 |
| 世界 | WorldSync、Channels -- 实时共享世界,每张地图一场对局,服务器端兴趣区域,频道 | 世界同步 |
| 战斗 | Matchmaker、PvpBattle、Spectator、Raids -- 服务器权威的野生与 PvP 战斗,ELO 匹配,观战,5 人突袭 | PvP 战斗、战斗权威 |
| 社交 | Chat、Guilds、Friends、Trade -- 频道和私聊,带角色的公会,好友与在线状态,原子化的玩家间交易 | 社交 |
| 经济 | Wallet、Shop、GTL、Gts、Inventory -- 服务器权威的货币、商店、Global Trade Link 市场和 Global Trade Station | 经济 |
| 住房 | Housing、BaseSync、Gym -- 其他人可以访问的秘密基地,基地内的实时同在,可供挑战的玩家道馆 | 玩家房屋 |
| 持久化 | CloudSave -- 带冲突检测的服务器端存档存储 | LiveOps |
| LiveOps | Events、Leaderboards、Achievements、Mods -- 实时活动、排名、成就、Mod 加载 | LiveOps |
| 运营 | AntiCheatManager、GameMasterService -- 反作弊检查,以及用于测试和运营线上服务器的游戏管理员控制台 | GM 模式 |
| 表达 | 向你周围的玩家显示的情绪气泡 | 在线表情 |
| 怪物赠礼 | 由服务器铸造的初始怪物和 NPC 赠礼 | 怪物赠礼 |
架构概览
┌─────────────┐ WebSocket ┌──────────────┐
│ Unity Client │ ◄──────────────► │ Nakama Server │
│ (OpenMon) │ │ (Docker) │
└─────────────┘ └──────┬───────┘
│
┌──────┴───────┐
│ PostgreSQL │
│ (Game Data) │
└──────────────┘
客户端通过 WebSocket 连接到 Nakama 以进行实时通信。所有权威的游戏逻辑通过 RPC(远程过程调用)在服务器端运行;世界运行在一个 Go 插件中。PostgreSQL 存储持久数据。
入门
步骤 1:设置服务器
服务器以一个包的形式提供。在 Hub 的 Online 选项卡中按 Extract Server Bundle,然后用 Docker 启动:
cd path/to/OpenMon-Nakama-Server
docker compose up -d postgres nakama
包中的 docker-compose.yml 已预先配置了 Nakama 和 PostgreSQL。这能让你在大约一分钟内获得一个本地开发服务器。Hub 的 Online 选项卡中还有用于 Docker 栈的 Start Server、Stop Server 和 Show Logs 按钮。
对于生产环境,你可以部署到任何云提供商。Nakama 支持:
- Heroic Cloud(托管,最简单)
- AWS / GCP / Azure(自托管,完全控制)
- DigitalOcean / Hetzner(经济实惠的 VPS)
详情参见在线设置。
步骤 2:配置客户端
在 Unity 中,设置 OnlineConfig 资产:
- 打开 OpenMon Hub(
Tools > MCE > OpenMon Hub)→ Online 选项卡 → Online Setup Wizard - 设置你的服务器 URL(默认:开发环境为
127.0.0.1:7350) - 设置服务器密钥(默认:开发环境为
defaultkey) - 配置资产位于
Resources文件夹中(Assets/Resources/OnlineConfig.asset),并会被自动加载
步骤 3:启用在线模式
把 MCE_ONLINE 脚本宏定义符号添加到你的项目中(或使用 Hub 的 Welcome 选项卡的 Setup Online 按钮,它会替你完成):
- Edit > Project Settings > Player > Scripting Define Symbols
- 添加
MCE_ONLINE - NakamaManager 单例会在第一个场景加载时自动创建
步骤 4:为服务器播种
新服务器并不 了解你的游戏。在判断任何战斗结果之前,先导出你的数据并发送出去:参见物种播种和 Hub 的 Seeding 选项卡。
步骤 5:测试连接
进入 Play Mode。控制台会显示类似这样的行:
[MCE Online] Connected as <DisplayName> (<UserId>)
打开第二个 Unity 编辑器实例(或构建一个独立版本),用两个客户端测试多人功能。
构建关键功能
PvP 战斗系统
OpenMon 的 PvP 战斗由服务器权威 —— 服务器验证每一个招式,防止作弊,并处理断线。
// Look for an opponent of a similar rating
await NakamaManager.Instance.Matchmaker.StartSearchAsync(eloRating: 1200, tier: "any");
NakamaManager.Instance.Matchmaker.OnMatchFound += (matchId, opponent) =>
{
// the authoritative battle then runs in a shared server-owned match
};
匹配系统在玩家 ELO 周围的评分窗口内搜索,并支持取消搜索。观战和 5 人突袭在同一个模块中:参见 PvP 战斗。
交易系统
由服务器验证的交易可防止道具复制,并确保公平交换:
var trade = NakamaManager.Instance.Trade;
string tradeId = await trade.RequestTradeAsync(partnerId);
await trade.OfferMonsterAsync(tradeId, monsterId);
await trade.OfferItemAsync(tradeId, "rare_candy", 5);
// Both players confirm; the server then executes the trade atomically
await trade.ConfirmTradeAsync(tradeId);
公会系统
GuildInfo guild = await NakamaManager.Instance.Guilds.CreateGuildAsync(
name: "Gym Leaders United", tag: "GLU", description: "Welcome!");
// Guilds have roles (promote, kick), search and member limits
玩家房屋
住房让玩家定制个人空间:
- 建造秘密基地并从目录中装饰它
- 让好友访问它(一张保存的快照,或在基地内一起实时在场)
- 挑战其他玩家的道馆
- 三个层次参见玩家房屋
经济与市场
服务器权威的经济可防止通货膨胀和被利用:
- 钱包与商店 -- 服务器拥有余额,并为道具定价
- Global Trade Link(GTL) -- 玩家挂出怪物和道具出售;其他玩家搜索并购买,需要挂单费和有效期
- Global Trade Station(GTS) -- 存入一只怪物,并要求换取另一种
游戏管理员控制台
使用 GM 模式的动词,在编辑器或游戏中运营并测试你的线上服务器。
为生产环境扩展
面向扩展的服务器架构
世界被设计为按玩家计成本很低:服务器每个 tick 向每个客户端发送一个批次,只包含它能看到的内容。下面的规模划分是规划指南,而不是承诺:请衡量你自己的部署。
| 并发玩家 | 基础设施 |
|---|---|
| 1-500 | 单个 Nakama + PostgreSQL |
| 500-5,000 | Nakama 集群(2-3 个节点)+ 托管 PostgreSQL |
| 5,000-50,000 | 自动扩缩的 Nakama 集群 + 只读副本 |
| 50,000+ | 区域集群 + 全球匹配 |
托管成本(估算)
| 规模 | 月成本 |
|---|---|
| 开发 | 0 美元(本地 Docker) |
| 软启动(100 CCU) | 20-50 美元/月(VPS) |
| 运营中(1,000 CCU) | 100-300 美元/月 |
| 增长期(10,000 CCU) | 500-2,000 美元/月 |
这些是粗略的估算。实际成本取决于你的服务器位置、数据传输和数据库大小。
PokeMMO 构建的、而你开箱即得的内容
| 功能 | PokeMMO(自研,10 年以上) | OpenMon Online(已包含) |
|---|---|---|
| 实时世界 | 自研 Java 网络 | 每张地图一场 Nakama 对局,服务器端兴趣区域 |
| PvP 战斗 | 自研战斗服务器 | 服务器权威的 PvP |
| 交易 | 自研交易协议 | 经过验证的交易服务 |
| 聊天 | 自研聊天服务器 | Nakama 聊天频道 |
| 经济 | 自研市场 | GTL / GTS 市场 + 钱包与商店 |
| 反作弊 | 自研服务器验证 | 服务器权威的逻辑 |
| 公会 | 自研公会系统 | Nakama 群组 + 扩展 |
局限与诚实的预期
构建 MMO 很难。OpenMon Pro 处理技术基础设施,但你仍然需要:
- 设计引人入胜的内容 -- MMO 需要持续的内容来留住玩家
- 管理你的社区 -- 聊天管理、封禁系统、玩家举报
- 维护服务器 -- 更新、监控、备份、扩容
- 平衡经济 -- 真实货币与游戏内货币的经济
- 处理运营 -- 客户支持、错误分流、实时活动
MMO 是一项服务,而不是一个产品。请为持续的投入做好准备。