games104-gameplay和游戏AI
gameplay
事件机制
发布订阅模式
核心:
- 事件定义:可以用面向对象的类定义,但是如何扩展、如何热重载是个很大问题,利用反射写在外部文件?dll注入?
- 回调函数注册:GO没了咋办,空指针问题,强引用(shared_ptr,有东西没释放对象也不能释放)/ 弱引用(常用一点,对某一时刻查看场景中其他对象可以用如weak_ptr)
- 消息分发:循环队列事件池,加上多个不同类型的队列架构,大量消息的触发导致帧延迟,如何解决?
脚本系统
游戏逻辑,热更新,编译型语言不行
解释型语言闪亮登场,方便热更新,寄了也是虚拟机寄不影响引擎,非常哇塞
GO管理,利用解释性语言的垃圾回收!,适用于对象特别多的,简单的可以引擎内核直接管理
可视化脚本
blueprint蓝图!低代码平台
基础AI
导航Navigation
- 地图表示
- 寻路:A*算法:启发式算法,g(n)+f(n)已经走过的距离+估计要走的距离,优先搜索估计最近的点,同时找到目的就结束计算(区分与迪杰斯特拉算法)
- 路径平滑:Funnel算法,烟囱收缩大法,很强,直接直线走
转向
主要用于车辆寻路
群体模拟
- 宏观定义:定义一个路线,让npc走
- 围观控制:定义个体,比如和周围物体靠太近就远离
是否要为每个npc设置寻路?设置障碍的距离场,距离越近斥力越强,从而实现群体的控制
环境感知
基于位置、血量、空间信息、战术地图、热力图、周围物体等等基础信息
行为树
对人类思考方式的一种模拟
一些中间节点
- Sequence:顺序执行所有子树,例如开门动作,描述为一个task序列,子节点返回是否完成,逻辑清晰
- Selector:分支,完成一个就返回
- Parallel:并行执行子树,例如实现npc的边走边开枪
- Decorator:常用小东西抽象出来的节点
每次tick都从根节点开始(为了加速可能直接激活树中的一些节点),同时running的节点可能有很多,一些行为是可以被打断的
Blackboard:实现行为树中间的信息交换
高级AI
上述的都是forward的实现,有点死板,高级AI根据目标反向构建行为
HTN(Hierarchical Tasks Network)
层次任务网络,Dark Soul 3!Horizon!Dying Lighting 2!
GOAP
目标导向行为规划,目标集、行动集
MCTS蒙特卡洛树搜索
AlphaGO!
类似人类下围棋的思考,树形模拟棋局,根据大量棋谱作为默认策略,进行快速模拟和决策
成功率 = Q/N,Q:成功次数,N:从某个点出发做的模拟次数
- 选择最有希望的节点
- 扩展树
- 模拟输赢
- 反向传播,向上更新节点成功率
优先未探索的还是当前成功率较高的节点?根据是否保守、父节点模拟次数
如何选择下一步?很多策略,访问次数最多、成功率最高、采样节点最高、或者继续爆算等等
机器学习
如何描述游戏世界?地图、态势表达
如何对游戏世界做些什么?攻击、移动等等
奖惩设计?输赢-1+1
网路结构设计?对各个输入应用不同的网络编码(ResNet、MLP、transformer、LSTM等等),再解码输出
训练策略?防止陷入局部最优,和多个对手互博
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.