能迂回,会绕路的开源游戏AI:解决怪物撞墙卡死角

贾浩楠 发自 凹非寺
量子位 报道 | 公众号 QbitAI

作为一个游戏玩家,有一天你发现了游戏中的bug:

竟然可以把怪拉到墙角卡住!

于是整个游戏成了白送局,一刀999,本来要1个小时的关卡5分钟就打通了,很爽对吗?

能迂回,会绕路的开源游戏AI:解决怪物撞墙卡死角

爽完之后呢?是不是有无可言状的空虚和罪恶感?一个好游戏就这么废掉了。

能迂回,会绕路的开源游戏AI:解决怪物撞墙卡死角

游戏开发者本意是想让玩家历经磨难、欲罢不能,但愚蠢的游戏bug毁了一切。

最近,一家来自加拿大的初创游戏工作室:A Bit Awake,开源了新模型——Enemy AI,可以让游戏中的敌人自动追踪玩家路径,并主动避开墙角、岩石等环境障碍,提升整个游戏的挑战和可玩性。

如果你在做游戏开发,那么这个项目可能会对你有很大的帮助。

能迂回,会绕路的开源游戏AI:解决怪物撞墙卡死角

从0开始,先写一个卡墙角的蠢AI

首先,我们先在Godot引擎中建立一个使用KinematicBody2D碰撞节点的敌对单位,并且使用State Machine来设置它的状态。

写出最简单的、只会向玩家直线移动的敌人追踪状态:

能迂回,会绕路的开源游戏AI:解决怪物撞墙卡死角

玩家逃跑路径的设置与追踪

为了提高追踪算法的表现,先要给玩家角色的移动线路上设置标记。

这样一来,如果敌人无法看到玩家,就会自动搜寻是否有玩家留下的移动轨迹并向这个轨迹移动,就像警犬一样。

能迂回,会绕路的开源游戏AI:解决怪物撞墙卡死角

接下来要确保痕迹信息真实有效地留在路径上,这里用到了一个带计时器的Node2D场景。我们将轨迹产生间隔设为0.1秒。

能迂回,会绕路的开源游戏AI:解决怪物撞墙卡死角

调试时,如果你想让路径轨迹可见,只需要加一个ColorRect节点。

能迂回,会绕路的开源游戏AI:解决怪物撞墙卡死角

现在你的敌人已经激发出内心嗜血的本能,对玩家穷追不舍了!

物理障碍的设置

接下来我们还需要让敌对AI清楚追踪路径上有哪些要避开的障碍物。

首先要给敌对单位添加一个RayCast2D节点,同时还要设置环境中的物理层,让AI知道它与痕迹点之间(Ray)有哪些障碍。

在Godot中选出Project栏,在Project Settings中找到LayerNames选项,根据你的游戏选择2D或3DPhysics。

能迂回,会绕路的开源游戏AI:解决怪物撞墙卡死角

命名不同的的物理层后,要将这些物理层应用到不同的目标(比如岩石、墙、关闭的门等)之上,在Property Inspector栏中的Collision选项中将目标设置为某一定义好的物理层。

能迂回,会绕路的开源游戏AI:解决怪物撞墙卡死角

将目标的物理层设置好以后,我们还要更新敌人的RayCast2D节点,使它能够判断眼前的障碍物能否通过。

最后一步,将以上的步骤同步在敌人单位的追踪状态算法中:

能迂回,会绕路的开源游戏AI:解决怪物撞墙卡死角

好了,现在你的敌对AI如果在追踪路上遇到了障碍物丢失痕迹目标,它会逐个检查玩家的路径痕迹,并试图建立与痕迹点的连线,一旦成功就会马上开始追踪。

能迂回,会绕路的开源游戏AI:解决怪物撞墙卡死角

至此整个算法完成,实现简单,但对游戏质量有大的提升,希望能够帮到做游戏开发的你。

代码开源链接:

https://abitawake.com/news/articles/enemy-ai-chasing-a-player-without-navigation2d-or-a-star-pathfinding

— 完 —

量子位 QbitAI · 头条号签约

关注我们,第一时间获知前沿科技动态

版权所有,未经授权不得以任何形式转载及使用,违者必究。

相关阅读