作为一个游戏玩家,有一天你发现了游戏中的bug:
竟然可以把怪拉到墙角卡住!
于是整个游戏成了白送局,一刀999,本来要1个小时的关卡5分钟就打通了,很爽对吗?
爽完之后呢?是不是有无可言状的空虚和罪恶感?一个好游戏就这么废掉了。
游戏开发者本意是想让玩家历经磨难、欲罢不能,但愚蠢的游戏bug毁了一切。
最近,一家来自加拿大的初创游戏工作室:A Bit Awake,开源了新模型——Enemy AI,可以让游戏中的敌人自动追踪玩家路径,并主动避开墙角、岩石等环境障碍,提升整个游戏的挑战和可玩性。
如果你在做游戏开发,那么这个项目可能会对你有很大的帮助。
从0开始,先写一个卡墙角的蠢AI
首先,我们先在Godot引擎中建立一个使用KinematicBody2D碰撞节点的敌对单位,并且使用State Machine来设置它的状态。
写出最简单的、只会向玩家直线移动的敌人追踪状态:
玩家逃跑路径的设置与追踪
为了提高追踪算法的表现,先要给玩家角色的移动线路上设置标记。
这样一来,如果敌人无法看到玩家,就会自动搜寻是否有玩家留下的移动轨迹并向这个轨迹移动,就像警犬一样。
接下来要确保痕迹信息真实有效地留在路径上,这里用到了一个带计时器的Node2D场景。我们将轨迹产生间隔设为0.1秒。
调试时,如果你想让路径轨迹可见,只需要加一个ColorRect节点。
现在你的敌人已经激发出内心嗜血的本能,对玩家穷追不舍了!
物理障碍的设置
接下来我们还需要让敌对AI清楚追踪路径上有哪些要避开的障碍物。
首先要给敌对单位添加一个RayCast2D节点,同时还要设置环境中的物理层,让AI知道它与痕迹点之间(Ray)有哪些障碍。
在Godot中选出Project栏,在Project Settings中找到LayerNames选项,根据你的游戏选择2D或3DPhysics。
命名不同的的物理层后,要将这些物理层应用到不同的目标(比如岩石、墙、关闭的门等)之上,在Property Inspector栏中的Collision选项中将目标设置为某一定义好的物理层。
将目标的物理层设置好以后,我们还要更新敌人的RayCast2D节点,使它能够判断眼前的障碍物能否通过。
最后一步,将以上的步骤同步在敌人单位的追踪状态算法中:
好了,现在你的敌对AI如果在追踪路上遇到了障碍物丢失痕迹目标,它会逐个检查玩家的路径痕迹,并试图建立与痕迹点的连线,一旦成功就会马上开始追踪。
至此整个算法完成,实现简单,但对游戏质量有大的提升,希望能够帮到做游戏开发的你。
代码开源链接:
https://abitawake.com/news/articles/enemy-ai-chasing-a-player-without-navigation2d-or-a-star-pathfinding
— 完 —
量子位 QbitAI · 头条号签约
关注我们,第一时间获知前沿科技动态
“