讨论群: 827072601
爱发电: https://afdian.net/@taohuayuan
任务板: https://trello.com/b/StForyw7/taohuayuan
twitter: https://twitter.com/zephyr1125
wiki: https://taohuayuanwiki.a2hosted.com
discord: https://discord.gg/sMuKYE6
这两周里git完全没有更新。时间都花在了对AI技术的研究上,深刻的意识到自己之前在AI技术上的欠缺。在我长期的手机游戏开发中,AI方面基本上只需要极为简单的逻辑,对于行业内真正广泛使用的几个技术的了解约等于零。
在上上次更新里提到将要使用效用系统(Utility System)来解决"做什么"的问题之后。目前的研究重点则是用于解决"怎么做"的Planning规划系统。我大概列举一下学习资料吧:
- MIT这边大概是GOAP的主要推手了,有很多论文和视频。论文里主要还是阐述概念,不会太多提及具体实现。三次会议paper感觉重复性有点高。
- 尝试研究了两个Unity下的第三方实现Regoap和GOAP。运行起来觉得性能上可能有点问题,并且都是OOP的(废话)。但是对于学习实现思路还是有帮助。
- Coursera这边有一个正经讲述AI的大学课程,注意这不是游戏AI,而是现实AI研究,所以我只是每晚看一节作为一个系统学习。目前很明显的发现游戏AI,尤其是Planning这块完全就是现实AI的延伸,思路几乎是完全一样的。如果有时间的话来学学现实AI,会对更深层次的基础能有个更好地掌握,并且拓展思路吧。
- 官方AI Planner,最近这几天在琢磨这玩意。这个思路完全符合我的需求,而且还是基于ECS的,发现它的时候极其兴奋。然而这东西自从3月份发布0.0.1之后就没更新过。并且与新版本ECS不兼容。研究后发现它依赖的Unity.Property库的CodeGen和Serielization功能都在新版本里被完全移除了。没办法只好用旧版本看他的示例程序作为学习资料了目前。但从有用程度来说仍然是我目前的重心。另外我在论坛也催更了一下...欢迎一起催更:), 希望可以尽快支持新版本ECS吧。
对了发一个这些天积累的笔记,有点乱。注意!因为是边看边学的笔记,所以里面的一些想法和理解可能是完全错误的,只能作为一个参考。
GOAP Notes
- GOAP可以在NPC行为上替代我的flow,flow依然可以继续用于玩家操作序列,系统功能序列等。
- 每个agent可以拥有n个sensor,但是处于优化的需要,与经典AI理论的sensor不同,这里只是一个标签,代表一个agent可以访问current state库中的一类state。
- 接上文,由于优化需要,我这里是一个公共的state库,因此有一套与AI决策无关的系统来负责维护current state库里的所有state的数据更新.
- 每个agent关于自身的state也位于current state库中,只是默认情况下只有自己可以访问,自己额外需要的一些其他state也如此。
- 因为优化和拟真的需要,AI决策是observability不完全的(sensor不完全),例如在运行到某一action时,不能得到预期effect,那么此时这个action除了要通知re-planning之外,还需要具有一个context effect,能够设置一个state以避免planner仍然认为此方案有效,陷入循环。
- 例如npc试图打开一扇门,这个门以他的sensor得来的state只是DOOR_CLOSED,但是执行OpenDoor的action的时候,由于玩家已经把门从另一侧锁住,因此执行失败。此时需要OpenDoor具有一个context effect修改这个门的state为DOOR_BLOCKED。以避免planner再次尝试开门。plannere于是会去尝试别的方案进屋。需要注意的是这个NPC的planner并不需要关心门打不开的具体原因,只需要知道它打不开。
- 这样的表现结果显然更为拟真。
- (这是否是AI课程所说的Explore和Learning的范畴呢)
- 由于玩家不能直接命令特定角色,对于非特定角色的goal,增加一个排序机制,以确保最擅长的角色优先试算
- 如果一个action的precondition里有多个的话,atTargetPos应该排在最前面(最后执行)(待验证)
- 对于需求数量的goal,比如物品请求,只要能让数量减少就通过,但是要在通过时生成一个新的同类型goal来描述剩下的数量需求。
- GOAP的ECS化的时间管理:每tick里,所有planner对所有自己的goal的所有可能分支进行一步广度优先的计算。这样基本上任何planner应该都能在10tick里找到最合适的目标。考虑到玩家如果同时下达巨多建设和生产命令的话,可以按照优先级顺序设置goal数量上限,超限者待命不计算,以优化性能。
- 每个角色的goal有两个来源,其一是玩家指定的工作及其优先级会成为所有人都要检查的goal。其二是角色自己通过效用系统为满足自己而产生的goal。
- 在search过程中每个action(node)要记录parent, child, path node, depth
最后,房租要到期了,今天开始打包东西了,工作又要暂停一下。顺便我也要想一想,在官方有一个AI Planner的情况下(尽管目前很不靠谱),我是否要继续头铁的开发自己的Planner。或者先转向其他工作内容,稍微等等看它会不会更新好了,将来直接用?如果选择后者的话,在没有npc行为响应的情况下,是不是会妨碍其他工作内容的制作?下次Log里尝试回答这个路线问题吧。
暂无关于此日志的评论。