互联网
类型
可以朗读
语音朗读
226千字
字数
2017-01-01
发行日期
展开全部
主编推荐语
利用Lua编程开发,专注于动作、动画和战术的游戏AI。
内容简介
游戏人工智能(游戏AI)是游戏开发的一个重要方面,在很大程度上决定了游戏产品的逼真程度和对玩家的吸引力,由此也得到游戏开发工程师越来越多的重视。
本书秉承把动画和运动系统直接集成到AI系统的方法,详细介绍了如何使用Lua语言及相关的技术和工具,编写和实现高质量的游戏AI。全书共9章,分别介绍了沙箱基础、创建和移动智能体、角色动画、意识控制、导航、决策制定、知识表达、感知和策略等主题。
本书适合于游戏开发工程师,特别是想要详细了解游戏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 小结
展开全部
出版方
人民邮电出版社
人民邮电出版社是工业和信息化部主管的大型专业出版社,成立于1953年10月1日。人民邮电出版社坚持“立足信息产业、面向现代社会、传播科学知识、服务科教兴国”,致力于通信、计算机、电子技术、教材、少儿、经管、摄影、集邮、旅游、心理学等领域的专业图书出版。