我在《矮人公会狂热》这款游戏上已经工作了相当长一段时间,刚刚推出了迄今为止可能是最大的一次更新。这次更新极大地改变了游戏,所以我想暂时不谈新功能,而是聊聊用Unity构建策略游戏的真实感受——尤其是最让我头疼的部分:AI和平衡性。
最初开始制作《矮人公会狂热》时,它本应是一款相当直接的回合制经济策略游戏。想法很简单:管理你的公会,收集资源,发展经济,努力成为最富有、最有声望的矮人派系。但随着时间的推移,我不断添加系统。先是派系,然后是政治,接着是外交,然后是联盟和外交协议,接着是战争,再然后是领土扩张。突然间,我做出了一个游戏,每个玩家每回合都可能面对数百种选择。
现在你可以结盟、谈判外交协议、管理与其他派系的关系、宣战、战斗、扩张领土、管理内政、发展经济、指派单位,以及努力防止整个矮人文明从内部崩溃。这就引出了那个占用我时间多得令人难以启齿的问题:让AI真正会玩这个游戏。
AI难到离谱
我之前的三个游戏都是FPS类型的,所以这对我来说是游戏开发思维方式的一个巨大转变。在FPS中,你可以给AI一组相对较小的即时决策:移动到这儿、射击那个、调查这个、找掩护。策略游戏则完全不同。想象一下,给AI20个单位、数百个地块、几十种可能行动、多种资源、与其他15个玩家的外交关系、军事分数、经济状况、国内问题以及一堆长期目标。然后问它:"这回合该做什么?"接着下回合再问一次。再下一回合,再下一回合。它需要做出不仅单个合理、而且符合整体策略的决策。
我最终彻底重建了AI系统四次,才达到现在使用的架构。我学到的最重要一课是:不能只让AI问"我现在能采取的最佳行动是什么?"它首先需要问:"我到底想达成什么?"
分层处理
当前系统将AI的整体战略优先级与各单位能执行的单独行动分离开来。在每回合开始时,AI会评估当前的战略形势,并为几个广泛的战略领域生成一个0到1之间的优先级分数:经济、军事、内政、外交和扩张。因此,某个AI可能会根据当前情况决定其优先级大致如下:军事0.85,经济0.70,扩张0.55,外交0.30,内政0.15。
这并没有告诉AI具体该做什么。而是告诉AI的其他部分它应该偏向哪种决策。如果AI正在准备战争,军事行动的价值会大大提升。如果经济崩溃,经济行动变得更加重要。如果被强敌包围,外交可能突然成为极高优先级。
然后由单位级别的AI接手。不是用一个庞大的AI系统评估每个单位的每个可能行动,而是由每个单位自己负责找出它能实际做的事情。商人可以评估市场、贸易机会、有价值的资源和潜在的贸易路线。外交官可以考察敌对派系、现有外交关系、潜在联盟以及可能愿意谈判的玩家。军事单位可以查看敌方领土、友方领土、战略位置、潜在攻击和防御阵地。
这里的关键是,单位不一定要评估地图上的每个地块。如果我有500个地块,而一个商人只能与其中30个进行有效互动,那就没必要让商人给500个地块都打分。相反,每个AI单位首先将地图过滤到一个合理的潜在目标子集,然后评估这些目标。这对性能产生了惊人的巨大影响。原本每次你点击"下一回合"时,AI都要完成大量工作,因为它实际上在考虑成千上万个无意义的组合。
结合上下文的评分
一旦单位弄清楚自己能做什么,它就会给这些行动打分。你可能会得到这样一个列表:商人在A市场交易得72分,商人在B市场交易得61分,建筑工建造房屋得58分,外交官提议条约得54分,士兵攻击敌人得51分。但这些还不是最终分数。AI的整体战略优先级会被加入其中。如果AI认为这回合军事极其重要,军事行动就会得到加成。如果外交目前是低优先级,外交行动就会被降低。这意味着单个单位不需要理解整个战略形势。策略层说"军事现在很重要",军事单位说"以下是我能执行的最佳军事行动",然后AI规划器将两者结合。
一旦每个单位生成了最佳行动,它们会被合并成一个排序列表,按战略分数排序。AI现在有了一份类似巨型购物清单的东西:攻击敌方阵地、建造军营、招募团、建立贸易路线、建造房屋、发送外交提案、扩张到领土等等。然后规划器顺着这个列表往下走,尝试将这些行动实际分配给单位。当它看到"建造房屋 → 建造者#3"时,它会检查建造者#3是否真的能执行该行动。如果可以,行动就被分配。一旦某个建筑工被分配了一个行动,我就会从考虑中移除其他与之冲突的建筑工行动。让AI为同一个单位在同一回合计划五件不同的事情毫无意义。
这听起来相当简单,但一旦你开始处理多个单位争夺同一地块、行动互相冲突、以及之前的决策消耗了资源等情况,就会遇到很多边缘情况。
资源问题
我在AI方面遇到的最大问题实际上是资源管理。最初,AI会查看可用的行动,然后选择当前能负担得起的最高分行动。这听起来很合理,但事实并非如此。结果就是AI不断将资源花在便宜、不重要的行动上,却从未在它真正需要的昂贵事情上取得进展。想象一下,AI想建造一座价值500金币的强大军事建筑。它目前有400金币,所以买不起,就忽略了它。然后它发现一座价值50金币的低优先级建筑,就买了。然后又买一个便宜的行动。再买一个。它不断花钱,却从不攒钱去做它真正想做的事。
所以我引入了规划预算。AI在规划阶段开始时生成一张可用资源的快照,每次考虑一个行动时,该行动的成本都会从规划预算中扣除——即使AI目前无法负担执行它。这是一个非常重要的改变。如果AI决定"我真的很想造这座500金币的军事建筑",但只有400金币,那个行动仍然会从规划预算中消耗500。因此AI不会突然把那400金币花在五个不相关的行动上。相反,它有效地决定:"我要为这个攒钱。"在未来的某个回合,一旦拥有足够资源,它就能实际执行该行动。这让AI显得更有目的性,因为它不只是对当前能负担得起的行动做出反应,而是能够围绕未来的资源需求进行规划。
为什么不直接模拟未来?
一个显而易见的解决方案是模拟未来几个回合,然后选择能产生最佳结果的行动序列。问题在于计算成本。当你有数百个可能的行动、多个单位、几十个可能的地块、以及外交、经济、战争和领土之间的互动时,可能的未来状态数量会迅速变得荒谬。试图暴力枚举所有可能的决策树,对于我想实现的目标来说完全不切实际。
相反,我采用了一种更分层的办法:战略目标 → 行动评估 → 单位选择 → 资源规划 → 执行。我不是让AI模拟一切,而是让每一层做出相对明智的决策,然后结合这些决策。这并不完美,但我发现它在AI质量和性能之间给出了一个更好的平衡。老实说,找到这个平衡可能是我整个游戏开发中最困难的部分之一。
然后还有平衡性
平衡一款策略游戏基本上本身就是一份全职工作。每次我改动一个数字,可能会影响其他五个系统。提高某种资源的价值,经济就变了。经济变了,军事生产就变了。军事生产变了,外交就变了。外交变了,AI扩张就变了。扩张变了,资源可用性就变了。突然间,一个小小的平衡调整完全改变了AI玩整个游戏的方式。
我花了大量时间观察AI之间的对局,寻找那些AI根据评分系统做出的决策在技术上合理、但人类一看就知道明显愚蠢的情况。这实际上是我开发过程中最有用的部分之一:观察AI自相残杀。你会开始看到从未明确编程过的涌现行为。两个派系成为长期盟友。一个弱小的派系拼命建立联盟,因为它知道自己单独无法赢得战争。一个AI激进扩张,然后彻底搞垮了经济。一个派系变得极其富有但军事脆弱。或者一个AI认为战争根本不值得,转而发展经济。这些时刻可能是开发这款游戏最令人满足的部分。
其他方面
除了AI,我最近在呈现方面也下了很多功夫。我一直在重建和优化大量UI,改进地图呈现,为行动添加更多反馈,总之努力让游戏不再像一堆系统的集合,而更像一个真正有凝聚力的策略游戏。
我还添加了一个纹章系统,因为,嗯,为什么不呢?你可以为你的派系创建一枚纹章,让它代表你的文明出现在游戏世界中。这是那种 gameplay 不一定需要、但能为世界增添许多个性的功能。
我仍在摸索《矮人公会狂热》到底想成为什么样的游戏。它始于一个相对简单的经济策略游戏,逐渐长成了这个集经济、政治、外交、战争、派系和领土战略于一体的奇怪组合。这带来了很多技术挑战,但也让这个项目变得更有趣。
我真的很想听听大家对我的视觉方向、UI、AI方法以及整体第一印象的看法。尤其是其他Unity开发者——我对人们在策略游戏中如何处理AI架构非常感兴趣,因为这绝对是一个我主要通过反复打破自己的系统并重建来学习的领域。
感谢你参加我的策略游戏TED演讲。😂
Steam页面:
https://store.steampowered.com/app/4346210/Dwarf_Guild_Mania/
评论 (0)