-
Notifications
You must be signed in to change notification settings - Fork 441
4.Monster AI
怪物 AI 主要放在后端实现,以后有空了我也打算做前端假怪,比如可以用在副本,打完怪后发个结算给后端就算通关。甚至一些小怪也可以只用前端做表现,尤其是割草副本,不需要每只小怪的表现都在各客户端一致,但那是后话了。
本来做 AI 我是打算一开始就用行为树的,但还有其它更重要的功能想先弄,比如战斗的,所以就先用状态机凑合着。为了方便以后能顺畅地转为行为树,我参考了 Unity NodeCanvas 插件的设计,所以稍微有点复杂,但我相信是值得的,见 Server/lualib/Blueprint,目前只完成了状态机部分。
现在的怪物 AI 状态可从 MonsterFSM.lua 文件可见,只有三大状态 : PatrolState 巡逻、FightState 战斗、DeadState 死亡复活。
首先巡逻信息是配置在每个场景文件里的:比如 config_scene_1001.lua。其 monster_list 列表就是每个哨点坐标,哨兵怪物类型和数量,和哨点的半径距离。
启动后端时会创建各个场景,然后读取各个场景信息文件创建哨点,也顺便把哨兵也生成了(见 MonsterMgr.lua),每个怪物都对应一个
BP.GraphsOwner 对象,其可以包含各种 Graph,状态机、行为树和节点流都是一种 Graph,现在因为需求简单,只创建了 MonsterFSM 状态机。调用这个 Graph Update 的地方见 AISystem.lua。
默认是 PatrolState ,就是每隔一定时间就随机跑到一个点,和检查附近有没什么敌对对象,有的话就标识为目标(写入到 blackborad 黑板对象,其用于 Graph 里节点间的信息共享)。
FightState 就是每隔一定时间就判断和目标的距离,够近的话就攻击,不然就追上去,如果远到一定距离或目标死了或跑了就转到 PatrolState。
DeadState 是在扣血时发现 hp 少于等于0才跳转过去的,见 Hurt.lua。该状态将维持一定时间(根据怪物的复活时间配置)然后自动复活。