Lua游戏AI开发指南
技术评审简介
1 从构建沙箱开始
1.1 AI沙箱简介
1.1.1 理解沙箱
1.1.2 项目文件组织
1.1.3 预先做好的构建
1.1.4 使用Visual Studio 2008/2010/2012/2013编译沙箱项目
1.1.5 开源库
1.1.6 开源工具
1.1.7 Lua IDE-Decoda
1.1.8 在Decoda中运行AI沙箱
1.1.9 创建一个新的Decoda项目
1.1.10 调试Lua脚本
1.1.11 Decoda的Watch窗口
1.1.12 Decoda的Call Stack窗口
1.1.13 Decoda的Virtual Machines窗口
1.1.14 同时调试Lua与C++代码
1.1.15 Visual Studio——附加到进程
1.1.16 Decoda——附加到进程
1.1.17 Decoda——附加到系统调试器
1.1.18 关联Lua脚本代码到Decoda
1.1.19 Lua虚拟机
1.1.20 Lua堆栈
1.1.21 Lua基础类型
1.1.22 元表
1.1.23 元方法
1.1.24 自定义类型
1.1.25 C/C++调用Lua函数
1.1.26 Lua调用C/C++函数
1.1.27 创建自定义数据类型
1.1.28 Demo框架
1.2 小结
2 创建并移动智能体
2.1 新建一个沙箱项目
2.2 创建文件结构
2.3 扩展SandboxApplication类
2.4 首次运行沙箱
2.5 新建一个Decoda项目
2.6 配置Decoda运行的可执行程序
2.7 创建一个沙箱Lua脚本
2.7.1 创建地板
2.7.2 添加光源
2.7.3 添加天空盒
2.7.4 在沙箱中添加网格
2.7.5 创建沙箱对象
2.8 发射方块
2.9 创建智能体Lua脚本
2.9.1 创建视觉表象
2.9.2 更新智能体的位置
2.9.3 更新智能体的朝向
2.10 智能体的属性
2.10.1 朝向
2.10.2 定位
2.10.3 大小
2.10.4 物理
2.10.5 知识
2.10.6 智能体的移动
2.10.7 智能体转向力
2.10.8 规避
2.10.9 规避障碍物和其他智能体
2.10.10 群组移动
2.10.11 创建一群追随者
2.10.12 转向力合计
2.11 小结
3 角色动画
3.1 骨骼和网格
3.1.1 网格骨骼
3.1.2 加载一个动画网格
3.1.3 显示骨骼
3.2 附加网格到骨骼上
给战士附加武器
3.3 动画片段
3.3.1 播放战士动画
3.3.2 战士动画
3.4 战士的姿势
武器姿势
3.5 操作动画
3.5.1 启用和禁用动画
3.5.2 循环动画
3.5.3 动画的长度
3.5.4 动画时间
3.5.5 归一化时间
3.5.6 重新开始动画
3.5.7 播放非循环动画
3.5.8 动画速率
3.6 动画混合
3.6.1 动画权重
3.6.2 混合窗口
3.6.3 混合曲线
3.6.4 线性混合
3.6.5 处理混合权重
3.7 动画状态机(ASM)
3.7.1 状态
3.7.2 转换
3.7.3 创建动画状态机
3.7.4 创建辅助函数
3.7.5 添加状态
3.7.6 添加转换
3.7.7 添加外部辅助函数
3.7.8 强制设置状态
3.7.9 请求状态
3.7.10 更新动画状态机
3.7.11 处理状态转换和状态请求
3.7.12 更新运行中的动画
3.7.13 动画状态机实例
3.8 构造一个武器动画状态机
3.9 构建战士的动画状态机
3.10 更新动画状态机
3.11 处理状态
3.12 小结
4 意识体控制
4.1 创建身体
4.1.1 创建战士
4.1.2 附加动画网格到智能体
4.1.3 创建障碍训练场
4.2 为动画状态机添加回调
4.2.1 处理回调
4.2.2 为ASM添加回调
4.2.3 更新ASM以调用回调函数
4.3 让战士射击
4.3.1 骨骼位置
4.3.2 骨骼旋转
4.3.3 创建粒子效果
4.3.4 粒子方向
4.3.5 对象删除
4.3.6 碰撞效果回调
4.3.7 发射子弹
4.3.8 处理子弹碰撞效果
4.3.9 射击
4.4 让战士奔跑
4.4.1 设置穿越障碍训练场的路线
4.4.2 跑过障碍训练场
4.5 创建大脑
实现意识体控制的方法
4.6 直接动画控制
4.6.1 死亡状态
4.6.2 空闲状态
4.6.3 下落状态
4.6.4 移动状态
4.6.5 射击状态
4.7 一个简单的有限状态机
4.7.1 初始化智能体
4.7.2 智能体FSM状态处理
4.8 间接动画控制
4.8.1 动画控制器
4.8.2 命令
4.8.3 命令队列
4.8.4 操作命令
4.8.5 姿势改变命令
4.8.6 死亡命令
4.8.7 下落命令
4.8.8 空闲命令
4.8.9 移动命令
4.8.10 射击命令
4.8.11 赋值成员函数
4.8.12 初始化控制器
4.8.13 添加命令处理函数
4.8.14 更新控制器
4.9 运行障碍训练场
4.9.1 创建直接控制智能体
4.9.2 创建间接控制智能体
4.9.3 间接控制智能体初始化
4.9.4 间接控制智能体更新
4.9.5 间接控制智能体的控制
4.9.6 产生一个间接控制的智能体
4.10 动作延迟
4.11 小结
5 导航
5.1 寻路
5.2 创建导航网格
5.2.1 配置导航网格
5.2.2 可通行高度
5.2.3 可通行半径
5.2.4 可通行的攀爬高度
5.2.5 可通行的斜坡角度
5.2.6 最小区域面积
5.2.7 构建导航网格
5.2.8 绘制导航网格
5.3 在导航网格中寻路
5.3.1 路径查询
5.3.2 查询结果
5.3.3 随机导航路点
5.4 路径信息
5.5 为战士添加随机寻路
5.5.1 更新智能体的路径
5.5.2 绘制路径
5.5.3 初始化导航网格
5.5.4 随意移动的智能体
5.6 创建更多的导航网格
5.7 小结
6 决策制定
6.1 创建自定义类型
6.2 智能体动作
6.2.1 添加数据成员
6.2.2 动作初始化
6.2.3 动作更新
6.2.4 动作清理
6.2.5 动作的成员函数
6.3 创建动作
6.3.1 空闲动作
6.3.2 死亡动作
6.3.3 换弹药动作
6.3.4 射击动作
6.3.5 随机移动动作
6.3.6 移动动作
6.3.7 逃跑动作
6.3.8 追逐动作
6.4 求值器
6.5 创建求值器
6.5.1 常数求值器
6.5.2 是否拥有弹药求值器
6.5.3 是否有生命危险求值器
6.5.4 是否有敌人求值器
6.5.5 是否移动求值器
6.5.6 是否存活求值器
6.5.7 能否射击敌人求值器
6.5.8 50比50机会求值器
6.6 决策结构
6.7 决策树
6.7.1 分支
6.7.2 决策叶节点
6.7.3 分支求值
6.8 构造一棵决策树
创建分支
6.9 创建一个决策树智能体
6.9.1 决策树的优点
6.9.2 决策树的缺点
6.10 有限状态机
6.10.1 状态
6.10.2 转换
6.10.3 有限状态机结构
6.10.4 辅助函数
6.10.5 添加状态和转换
6.10.6 更新有限状态机
6.10.7 添加实例函数
6.11 构造有限状态机
6.11.1 空闲状态
6.11.2 移动状态
6.11.3 随机移动状态
6.11.4 射击状态
6.11.5 逃跑状态
6.11.6 死亡状态
6.11.7 追逐状态
6.11.8 换子弹状态
6.12 创建一个有限状态机智能体
6.13 有限状态机的优点
6.14 有限状态机的缺点
6.15 行为树
6.15.1 行为树节点
6.15.2 辅助函数
6.15.3 更新行为树节点
6.16 动作
6.17 条件
6.18 选择器
6.19 序列
6.20 创建行为树对象
6.20.1 行为树辅助函数
6.20.2 选择器计算
6.20.3 序列计算
6.20.4 节点计算
6.20.5 继续行为树计算
6.20.6 行为树的更新循环
6.20.7 更新行为树
6.21 构造一颗行为树
6.21.1 死亡行为
6.21.2 逃跑行为
6.21.3 战斗行为
6.21.4 换子弹行为
6.21.5 射击行为
6.21.6 追逐行为
6.21.7 移动行为
6.21.8 随机移动行为
6.21.9 空闲行为
6.22 创建行为树智能体
6.23 行为树的优点
6.24 行为树的缺点
6.25 小结
7 知识表达
7.1 知识源
7.1.1 创建知识源
7.1.2 知识源求值
7.2 黑板
7.2.1 创建黑板
7.2.2 添加和删除知识源
7.2.3 知识源求值
7.2.4 设置和返回黑板属性
7.2.5 黑板的成员函数
7.3 创建战士的知识源
7.3.1 选择敌人
7.3.2 选择逃离位置
7.4 构造战士的黑板
7.5 更新决策求值器
7.6 更新行为动作
7.6.1 死亡动作
7.6.2 逃离动作
7.6.3 空闲动作
7.6.4 移动动作
7.6.5 追逐动作
7.6.6 换子弹动作
7.6.7 射击动作
7.7 小结
8 感知
8.1 事件
8.1.1 属性
8.1.2 发送事件
8.1.3 接收事件
8.2 管理事件
8.2.1 分配智能体团队
8.2.2 处理智能体通信
8.2.3 事件类型
8.3 创建智能体的感官
8.3.1 初始化感官
8.3.2 更新感官
8.4 智能体视觉
检测其他可见智能体
8.5 智能体视觉事件
8.5.1 看到新敌人的事件
8.5.2 看到新的敌人死尸事件
8.5.3 看到新的死亡队友事件
8.6 处理新看到的智能体
8.6.1 间歇性可见的智能体
8.6.2 限制智能体可视性的更新
8.6.3 创建事件处理
8.6.4 添加事件处理函数
8.7 智能体的听觉
8.8 听觉事件
8.8.1 子弹发射事件
8.8.2 子弹碰撞事件
8.9 处理听觉事件
8.10 清理黑板中的事件
8.11 清理听觉事件
8.12 团队交流
8.12.1 选择敌人事件
8.12.2 位置更新事件
8.12.3 撤退位置事件
8.13 更新智能体行为
8.13.1 选择敌人
8.13.2 评估危险位置
8.13.3 计算最佳逃离位置
8.14 小结
9 策略
9.1 影响力地图
9.1.1 单元格高度
9.1.2 单元格宽度
9.2 构造影响力地图
9.2.1 配置
9.2.2 导航网格的立体像素化
9.3 绘制影响力地图
9.4 访问影响力
9.4.1 设置影响力
9.4.2 获取影响力
9.5 清除影响力
9.6 传播影响力
9.6.1 单元格惯性
9.6.2 单元格衰减
9.7 影响力地图的图层
9.8 更新影响力地图
9.9 战士的策略
初始化和更新策略
9.10 团队影响力评分
9.10.1 初始化团队影响力
9.10.2 更新团队影响力
9.10.3 配置团队影响力
9.11 危险区域评分
9.11.1 利用智能体事件
9.11.2 添加事件处理器
9.11.3 初始化危险影响力
9.11.4 更新危险影响力
9.11.5 配置团队影响力
9.12 小结
思维导图
防止博客图床图片失效,防止图片源站外链:
http://www.processon.com/chart_image/5e5b3b94e4b069f82a1a630a.png)
思维导图在线编辑链接: