开发者日志03:Godot中多房间导航方案的实践
10/2412 浏览综合
昨天搞定了大地图的生成逻辑,今天开始处理导航的问题。项目是多个小房间拼起来的,需要实现跨房间的自动寻路,主要是给敌人AI用的。
一开始想的是用NavigationRegion2D,因为感觉能更灵活地定义导航区域。折腾了一阵发现几个问题:首先每个房间都得手动画导航多边形,工作量太大了;其次多房间连通虽然理论上可行,但需要保证各个区域的边界对齐,不然就会出现断点。测试的时候发现敌人经常在房间交界处卡住,调了半天参数还是不太稳定。
后来想起来项目本来就是用TileMap做的地图,干脆就试试Godot内置的TileMapLayer导航功能。配置起来简单多了,在TileSet里把能走的tile设置好Navigation Layer就行,不用手动画什么多边形。测试了一下,跨房间寻路直接就通了,NavigationServer2D会自动把所有房间的导航网格合并起来,完全不用担心连接的问题。
动态障碍物也比想象中简单。之前纠结要不要改用NavigationPolygon,后来发现直接用set_cell()就能实现。比如做个门的开关,关闭时把那个格子设成-1删掉tile,打开时重新set回地板tile,导航系统会自动更新。对于移动的障碍物,比如敌人之间的避让,加个NavigationObstacle2D节点就搞定,性能影响也不大。
最后还是决定用TileMap的方案。理由很简单:第一是省事,跟现有的地图系统完全贴合;第二是稳定,Godot对tile导航的支持很成熟,多房间连通完全是自动的;第三是够用,虽然精度受限于格子大小,但对这个项目来说完全足够了。NavigationRegion2D留着以后有特殊需求再说吧
。
。顺便封装了个NavigationManager,把路径查询和障碍物管理包了一层,代码干净了不少。现在敌人已经能在整个大地图里追玩家了,效果还不错
。
。明天就完善基本的的战斗系统了, 赛程的最后这几天才开始空出来疯狂追赶进度👻(不要问为啥进度这么低, 问就是工作业余时间参赛~)


