以势函数实现移动
势函数的优点:
- 只用一个函数处理追逐和闪躲
- 操作简单,只需要计算两个单位间的驱动力
势函数的缺点:
单位数量增多时,一旦彼此互动起来将耗用大量CPU资源
Lenard-Jones函数:分子间的引力和斥力
通过调整引力和斥力的参数
优化方法:
- 对于障碍物避开算法,对于相距较远的障碍物,可以不去计算势能;
- 将游戏领域分成网络,每一个格子都配置一个数组,来存储落在这个格子里面的障碍物数据。
- 也可以用这种网格方法,对成群结队算法做最佳化工作。
基本路径寻找及航点应用
解决各种类型的路径寻找问题的办法与需求细节有关。
例如:目的地会静止还是移动?有无障碍物?地形如何?最短路径是最佳方法吗?角色有无目的地?角色是否要在游戏环境中看似聪明地四处移动或探索(移动模式)?
基本路径寻找
- 追逐算法,沿对角线移动
- 视线追逐函数
避开障碍物
- 随机移动(视线追逐或者对角线移动)
- 绕行 何时停止绕行
- 改良绕行 整合视线算法
面包屑寻找路径
每次玩家走一步时,都会毫无所知地在游戏世界中留下看不见的标记即面包屑。
面包屑算法是计算机控制角色成群移动的有效方式。NPC侦察附近有无玩家留下的面包屑,再顺着面包屑移动。
遵循路径走
NPC分析周围地形,分析可能的方向,把不属于道路的部分剔除。
分析出可能方向后,考虑各个方向的权重。
沿着墙走
左侧/右侧移动法(适合迷宫)
航点导航
在游戏环境中置放节点,然后使用预先计算好的路径,或简单的路径寻找方法在节点中移动。
每个节点都至少应该让另一个节点的实现看见。对于以这种方式构成的游戏环境而言,游戏控制角色能使用简单的视线算法,到达图中的任何地点。
节点表:
A星算法
一、定义搜寻区域
1. 简化连续环境的搜索区域
砖块环境的游戏就是此算法的合适对象
2. 开始搜寻
伪代码:
1 | 把起始节点加进open list |
思路
先从起始节点开始搜寻,然后再分别去搜寻周围节点(扩散搜索,从一点开始向外辐射)直至到达目的地。
记分
我们替任何指定砖块记分公式是f(n)=g(n)+h(n)
- f(n) 是从初始状态经由状态n到目标状态的移动成本的估计函数
- g(n) 是在从初始状态到状态n的实际移动成本
- h(n) 是从状态n到目标状态的的移动成本的估计
h(n)的选取
我们以 d(n) 表达状态 n 到目标状态的实际距离,那么 h(n) 的选取大致有如下三种情况:
- 如果 h(n)< d(n) 到目标状态的实际距离,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。
- 如果 h(n)=d(n),即距离估计 h(n )等于最短距离,那么搜索将严格沿着最短路径进行, 此时的搜索效率是最高的。
- 如果 h(n)>d(n),搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。
g(n)的值可以告诉我们目标节点与起始节点之间,隔了几个母节点。
没怎么看懂
搜寻死路
地形成本
f(n)=g(n)+h(n)+地形成本
影响力对应
改变节点成本的方法,根据游戏里发生的情节而定
比如玩家在某一节点杀害了N只蜘蛛,该节点就会在成本上增加值,别的蜘蛛就会有意绕过这里。
描述式AI及描述引擎
通过描述机制改变对手的属性、行为、响应方式以及游戏事件。
描述机制技巧
描述对手属性
利用某种描述机制,指定每个AI对手的所有基本属性
描述对手行为
描述口语互动
*”I’m Groot!”*
搜寻玩家关键字
描述事件
脚本如何触发与AI角色可能不太有直接关联的游戏事件
比如:站在一个特定地点上会触发陷阱
最后还有个触发音效脚本
有限状态机
有限状态机是一种抽象机制,是处在各种不同的预定状态下的其中一种状态。有限状态机也可以定义一组条件,以确认何时应该改变状态。实际的状态会决定状态机的行为。