这个想法最初是在我玩另一款手机MMO时产生的。
玩了一段时间后,我意识到几乎所有玩家都使用相同的技能、相同的被动、相同的道具,甚至属性也大同小异。角色的成长过程不再让人有"塑造角色"的感觉。大多数时候,获胜的玩家只是那个氪金更多的玩家。
一时冲动下,我打开了GPT,开始询问自己动手做一款MMO到底有多复杂。
我一直怀念像《迦南Online》那种老派MMO的感觉:简单的系统、像素风画面、直白的战斗,尤其是那个"伙伴"系统。我喜欢那种与一个伙伴建立羁绊、共同成长的感觉,而不是养一个只是装饰品的宠物。在《卡纳里翁》里,伙伴是和你角色并肩作战的真正战士,拥有自己的主动技能和被动技能。
我也喜欢《仙境传说RO》的职业进阶系统。我想要的是那种打开就能玩、没有体力系统、没有自动寻路、没有持续引导的游戏,同时保留老派感觉,并给予玩家足够多的职业、技能、装备和伙伴来尝试不同的玩法。
我从事开发工作,所以《卡纳里翁》基本是在下班后和所有空闲时间搭建的。我已经有了一些Unity、数据库和后端开发的经验,所以一月的时候我想:为什么不至少试着做一款我自己想玩的MMO呢?
八个月后,《卡纳里翁Online》真的可以在浏览器里玩了。
它依然是一个进行中的项目,尤其是世界、动画和资源方面,但技术上来说,这大概是我经历过的最大的学习体验。
AI让我能够快速推进,但绝对没有让构建MMO变得简单。
当前项目状态
游戏完全在线且是服务端权威模式。客户端不做任何决定。操作是请求,服务端验证并拥有实际的游戏状态。
当前主要技术栈:
- 客户端:Godot 4.5,移动渲染器,HTML5导出
- 后端:C++,分布于18个服务
- 协议:FlatBuffers,15个共享Schema
- 数据库:PostgreSQL
- 临时状态:Redis
- 服务间通信:NATS
- 网页:Next.js 16 / React 19 / Tailwind 4
- 生产环境:原生VPS,前端使用nginx和Cloudflare
游戏定义与代码完全分离。大约130个JSON文件和12.8万行代码构成了客户端、后端和Web工具共享的唯一数据源。
目前包括:
- 189种怪物
- 396个主动技能
- 在此基础上还有大量被动技能和基石天赋
- 186个任务
- 物品、掉落表和成长体系
- 公式和平衡性
游戏代码中没有硬编码的平衡数值。
现在项目总代码量(C++后端、Godot客户端和游戏数据)约54万行,不包括生成的FlatBuffers代码。
它的规模增长比我预想得快得多。
我犯的最大错误
我最初离线构建了游戏的大部分内容。后来我决定要做一个真正的在线、服务端权威的游戏。
那非常痛苦。
像这样一个简单逻辑:
玩家攻击怪物 → 怪物掉血
变成了:
输入 → 请求 → 验证 → 模拟 → 状态变更 → 复制 → 渲染
许多我以为已经完成的东西不得不重新设计。事后看来,我真心觉得直接扔掉原有实现的大部分,用在线架构重新开始可能会更快。
如果我再开始做一款多人游戏,从第一天起就会确立服务端权威。
AI让范围蔓延变得危险地容易
另一个错误是低估了自己游戏设计带来的后果。
我花了大约两周设计职业系统、技能和成长体系。本来计划5个基础职业,后来加了第6个。
结果变成了:
- 6个基础职业
- 每个职业4个副职
- 每个副职2个专精
- 48条最终职业路径
- 396个主动技能
- 再加上被动、基石天赋以及它们之间的所有交互
问题不在于AI无法实现所有这些。问题在于每个新机制都会产生更多需要设计、测试、平衡和维护的内容。
这大概是我在AI辅助开发中发现的最大陷阱。因为你可以快速构建东西,所以你总想构建更多。
如今我花更多时间问"我该加这个吗?"而不是"我能加这个吗?"
我的AI工作流程彻底改变了
我大部分编码工作使用Claude Code,同时大量使用GPT/Codex进行调试、审计和获取第二意见。
起初我使用Claude的方式非常基础:一个代理,给它一个任务,审核结果。
然后我几乎尝试了所有方式:
- 每个任务一个代理
- 多个专用代理
- 协调器和子代理
- 代理审计其他代理
有一次我同时运行了大约15个代理。
这很有趣,但大部分时间很荒谬。协调代理本身又成了一个待解决的问题。
现在我简化到三个主要的永久上下文:
- 后端
- 游戏数据
- Godot客户端
当我遇到一个跨越多个系统的棘手bug时,我通常会专门分配另一个代理先审计完整的客户端→数据→后端流程。如果问题范围有限,它可以端到端地修复并测试。如果问题更大,它会产生一份报告,我再将报告交给三个主要代理。
相比15个代理来说没那么刺激,但可靠得多。
我也不会盲目接受它们生成的结果。我会阅读它们的技术决策、游戏逻辑、平衡性甚至背景设定建议。有时候答案根本就是错的。
如果我理解不了某个技术决策,我会让模型像对小孩子一样向我解释:我们为什么这么做,有什么替代方案,这可能会破坏什么?
AI让我能以远超手动编码的速度生成代码。它也能以远超的速度生成技术债务。
测试变得越来越重要
一开始,调试主要是:玩游 戏、复现bug、读日志、改点东西、再试一次。
这变得非常缓慢,所以我构建了一个小型的本地监控工具,并逐步增加了自动化测试。
现在有149个C++单元测试文件、116个针对真实数据库运行的Python集成测试、以及140个无头Godot测试文件。
一个最糟糕的例子:我有一个实现了生命值牺牲、生命偷取、净化和打断的类,有15个通过的单元测试文件。但它从未在生产中被调用。运行时的路径早在几个月前漂移到了另一个文件中,而所有仅存在于那个文件中的机制在真实游戏里都悄无声息地无效。
测试没有说谎。它们测试的是不存在的东西……
绿色测试只证明代码能运行,并不证明任何东西能到达玩家那里。
自动化测试仍然不能替代亲自玩游戏。我大概已经从头到尾完成自己的新手教程超过200次了。
修复点东西。重播教程。测试者发现一个软锁。修复它。重播教程。根据反馈改点东西。重播教程。
八个月后,我非常确信的一件事是我讨厌做新手教程。
说实话,美术比代码更难
我目前的资源工作流大致是:
- 角色和怪物:PixelLab
- 怪物动画:PixelLab
- 图块:PixelLab
- 图标:主要是ImageGen/Codex + PixelLab MCP
- 其他图像工作:ImageGen、Gemini和各种工具
- 音乐:Suno
- 音效:主要是免版税素材库
- 技能动画/VFX:Python、Codex和大量实验
我创建了图块和世界中的大部分物件,但把它们组合成一个让我满意的地图却是另一回事。在几次相当灾难性的尝试之后,我最终请我的妻子为我设计村庄。原来拥有碎片和知道如何排列它们是两种非常不同的技能 :')
动画也是最难做好的事情之一。我找到了一位非常出色的2D艺术家,我们一起制作了一些我很满意的动画。我很想做得更多,但《卡纳里翁》仍然是个下班后做的副业项目,所以美术预算有限 :)
这一切要花多少钱?
我目前的AI/工具预算大约是:
- Claude:200美元/月
- GPT:20美元/月
- PixelLab:平时约10美元/月,密集生成阶段高达50美元/月
加上正常的基础设施成本。
我现在处于什么阶段
我刻意尝试停止添加大型系统。
目前我专注于1到30/40级的内容,尤其是前20到30分钟的游戏体验:
- 更好的战斗手感
- 更清晰的成长曲线
- 更强的变强感
- Bug修复和整体流畅度
- 新手引导
- 背景故事
- 世界/地图改进
当这一部分感觉扎实后,我会转向40到70级的成长内容。
还有大量离谱的工作量,尤其是视觉方面,但作为一次技术和学习体验,这已经非常不可思议了。
我学到的最重要的一点大概是:
AI让编写软件的速度大大加快。但它并没有让构建游戏变得简单。
如果这里有谁在构建一个大型AI辅助游戏或代码库,我很想听听你的工作流程随着项目增长是如何变化的。如果谁想了解架构、数据管道、服务端权威战斗、测试或代理设置的更多细节,我很乐意分享。
另外,如果你擅长2D地图或动画,非常欢迎建议 :)
评论 (0)