今天又折腾了一天我的《疯狂小人战斗3》!这已经是第三个版本了,前两个版本虽然也能玩,但总觉得小人们打起来有点傻乎乎的。所以这回我下定决心要让它们变得更“疯狂”一点,也更聪明一点。
AI的进化之路
这回实践的重点,我放在了小人的AI行为上。以前的版本,小人们基本上就是看到敌人就一股脑冲上去,谁血多谁牛逼,没啥策略可言。这不行,得改!
第一步,我先是重新规划了小人的思考逻辑。 我寻思着,得让他们知道啥时候该打,啥时候该躲,啥时候该配合。我给他们设定了几种基本状态:比如“巡逻”、“追击”、“攻击”、“小范围躲避”还有“呼叫支援”(这个还没完全实现,但有想法了)。
然后就是开始敲代码。我先是把以前的AI代码翻出来,看哪些能用,哪些得重写。重写的部分占大多数。我尝试着给小人加入了“视野”和“听觉”的概念,虽然是很简化的模拟,但至少不会像以前那样,敌人站背后半天了都不知道。
视野判断: 我给每个小人前面加了个扇形的检测区域,敌人进入这个区域才会被“看到”。
攻击逻辑优化: 不再是无脑攻击最近的,我会根据敌人的威胁程度(比如血量、攻击力啥的,虽然目前只是简单设定)来选择目标。还尝试加入了一点点攻击前摇和后摇,让打斗看起来不那么生硬。
躲避尝试: 这个最头疼!一开始小人躲起来跟无头苍蝇似的,到处乱窜。后来我改成,当血量低到一定程度,并且附近有“障碍物”(我简单放了几个方块)时,会尝试往障碍物后面躲一下,然后再找机会反击。这个过程反反复复调了好久,经常出现小人卡墙角或者躲到地图外面去的BUG,头都大了。
调试过程简直是灾难。 我得开着游戏,看着一群小人打架,然后一个一个分析它们为啥做出这种“睿智”操作。有时候一个小参数调错,整个战场就乱套了,要么全都站着发呆,要么就是挤在一块儿动弹不得。我就不停地加日志,看变量,一步步排查。有一次为了解决一个寻路卡死的问题,我对着那段代码看了快两个小时,眼睛都快瞎了。
新的兵种与小道具的加入
光提升AI还不够刺激,我还想着加点新东西进去。
是新的兵种。 以前只有一种近战小人。这回我琢磨着加个远程的,比如弓箭手。这就涉及到新的攻击方式,新的动画(虽然我用的都是现成的免费资源,但找合适的也费劲),还有AI也得跟着改,弓箭手得知道保持距离。
我还给弓箭手设计了个“射击精度”的玩意儿,不是百发百中,有时候会射偏,这样感觉更真实点。为了实现这个,我还专门去学了点基础的概率算法,虽然用得很浅,但好歹是实现了。
然后是小道具。 我一直想在战场上加点随机元素。所以这回尝试加了个最简单的“血包”。战场上会随机刷出血包,小人血量低的时候,如果“看到”了,并且周围没啥大危险,就会跑过去吃。这个逻辑写起来也挺绕的,得判断优先级,不能正打得激烈,突然跑老远去吃血包?
测试与调整的循环
等这些东西都七七八八加上去之后,就是漫长的测试和调整了。我让两拨不同颜色的小人互殴,然后我就在旁边看戏,不,是观察。
观察它们的行为是不是符合我的预期。 比如,弓箭手会不会傻乎乎地冲到近战兵面前?小人会不会为了抢一个血包自相残杀(早期版本真出现过这种搞笑场面)?AI在不同情况下会不会做出相对合理的反应?
遇到不合理的地方,就停下来,改代码,调参数,再测试。这个过程真的非常枯燥,但每次看到小人们的行为因为我的修改而变得更“像样”一点,那种成就感又会支撑我继续下去。
比如,我发现弓箭手有时候会被近战兵追得满地图跑,根本没机会输出。后来我就给近战兵的追击AI加了个“耐力”或者说“追击时间”限制,追一会儿追不上就可能放弃,或者转而攻击其他目标。这样一来,弓箭手就有喘息和反击的机会了。
的小总结
今天这一天下来,感觉《疯狂小人战斗3》的AI确实比以前强了不少,虽然离我最终想要的效果还有差距,但起码小人们不再是单纯的无脑莽夫了。它们会尝试躲避,会根据情况选择目标,远程兵种也知道放风筝了(虽然放得还不咋地)。
最大的感受就是,做游戏(哪怕是这种小玩意儿)真的是个细致活儿。 一个小小的行为,背后可能就需要一大堆逻辑和代码来支撑。而且很多时候不是你一下子就能想明白的,需要在不断的测试和失败中慢慢摸索,慢慢调整。
我打算再优化一下寻路,然后把那个“呼叫支援”的AI逻辑给加上。路漫漫其修远兮,继续折腾!希望下次能有更大的进展分享给大家。