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等等),再解码输出

训练策略?防止陷入局部最优,和多个对手互博