第一部分 虚幻引擎C++编程 1
第1章 开发之前——五个最常见基类 2
1.1 简述 2
1.2 本立道生:虚幻引擎的UObject和Actor 2
1.2.1 UObject类 2
1.2.2 Actor类 5
1.3 灵魂与肉体:Pawn、Character和Controller 6
1.3.1 Pawn 6
1.3.2 Character 7
1.3.3 Controller 7
第2章 需求到实现 9
2.1 分析需求 9
2.2 转化需求为设计 10
第3章 创建自己的C++类 12
3.1 使用Unreal Editor创建C++类 12
3.2 手工创建C++类 14
3.3 虚幻引擎类命名规则 15
第4章 对象 16
4.1 类对象的产生 16
4.2 类对象的获取 18
4.3 类对象的销毁 18
第5章 从C++到蓝图 20
5.1 UPROPERTY宏 20
5.2 UFUNCTION宏 20
第6章 游戏性框架概述 22
6.1 行为树:概念与原理 22
6.1.1 为什么选择行为树 22
6.1.2 行为树原理 22
6.2 虚幻引擎网络架构 26
6.2.1 同步 26
6.2.2 广义的客户端-服务端模型 27
第7章 引擎系统相关类 30
7.1 在虚幻引擎4中使用正则表达式 30
7.2 FPaths类的使用 31
7.3 XML与JSON 32
7.4 文件读写与访问 33
7.5 GConfig类的使用 35
7.5.1 写配置 36
7.5.2 读配置 36
7.6 UE_LOG 37
7.6.1 简介 37
7.6.2 查看Log 37
7.6.3 使用Log 37
7.6.4 自定义Category 38
7.7 字符串处理 38
7.8 编译器相关技巧 39
7.8.1 “废弃”函数的标记 39
7.8.2 编译器指令实现跨平台 39
7.9 Images 40
第二部分 虚幻引擎浅析 45
第8章 模块机制 46
8.1 模块简介 46
8.2 创建自己的模块 47
8.2.1 快速完成模块创建 47
8.2.2 创建模块文件夹结构 48
8.2.3 创建模块构建文件 49
8.2.4 创建模块头文件与定义文件 49
8.2.5 创建模块预编译头文件 50
8.2.6 引入模块 51
8.3 虚幻引擎初始化模块加载顺序 52
8.4 道常无名:UBT和UHT简介 55
8.4.1 UBT 55
8.4.2 UHT 57
第9章 重要核心系统简介 62
9.1 内存分配 62
9.1.1 Windows操作系统下的内存分配方案 62
9.1.2 IntelTBB内存分配器 63
9.2 引擎初始化过程 65
9.3 并行与并发 67
9.3.1 从实验开始 68
9.3.2 线程 71
9.3.3 Task Graph系统 73
9.3.4 Std::Thread 77
9.3.5 线程同步 78
9.3.6 多进程 80
第10章 对象模型 81
10.1 UObject对象 81
10.1.1 来源 82
10.1.2 重生:序列化 83
10.1.3 释放与消亡 92
10.1.4 拉圾回收 94
10.2 Actor对象 99
10.2.1 来源 101
10.2.2 加载 104
10.2.3 释放与消亡 105
第11章 虚幻引擎的渲染系统 107
11.1 渲染线程 107
11.1.1 渲染线程的启动 108
11.1.2 渲染线程的运行 108
11.2 渲染架构 109
11.2.1 延迟渲染 109
11.2.2 延迟渲染在Post Process中的运用 110
11.3 渲染过程 111
11.3.1 延迟渲染到最终结果 112
11.3.2 渲染着色器数据提供 123
11.4 场景代理SceneProxy 126
11.4.1 逻辑的世界与渲染的世界 126
11.4.2 渲染代理的创建 127
11.4.3 渲染代理的更新 128
11.4.4 实战:创建新的渲染代理 128
11.4.5 进阶:创建静态渲染代理 132
11.4.6 静态网格物体渲染代理排序 148
11.5 Shader 150
11.5.1 测试工程 150
11.5.2 定义Shader 152
11.5.3 定义Shader对应的C++类 153
11.5.4 我们做了什么 162
11.6 材质 163
11.6.1 概述 164
11.6.2 材质相关C++类关系 166
11.6.3 编译 167
11.6.4 ShaderMap产生 168
第12章 Slate界面系统 170
12.1 Slate的两次排布 170
12.2 Slate的更新 170
12.3 Slate的渲染 171
第13章 蓝图 173
13.1 蓝图架构简述 173
13.2 前端:蓝图存储与编辑 174
13.2.1 Schema 174
13.2.2 编辑器 175
13.3 后端:蓝图的编译 176
13.4 蓝图虚拟机 187
13.4.1 便笺纸与白领的故事 187
13.4.2 虚幻引擎的实现 189
13.4.3 C++函数注册到蓝图 193
13.5 蓝图系统小结 194
第三部分 扩展虚幻引擎 197
第14章 引擎独立应用程序 198
14.1 简介 198
14.2 如何开始 198
14.3 BlankProgram 199
14.4 走得更远 202
14.4.1 预先准备 203
14.4.2 增加模块引用 203
14.4.3 添加头文件引用 203
14.4.4 修改Main函数为WinMain 204
14.4.5 添加LOCTEXT_NAMESPACE定义 204
14.4.6 添加SlateStandaloneApplication 204
14.4.7 链接CoreUObject 205
14.4.8 添加一个Window 205
14.4.9 最终代码 205
14.5 剥离引擎独立应用程序 207
第15章 插件开发 208
15.1 简介 208
15.2 开始之前 208
15.3 创建插件 210
15.3.1 引擎插件与项目插件 210
15.3.2 插件结构 210
15.3.3 模块入口 213
15.4 基于Slate的界面 213
15.4.1 Slate简介 213
15.4.2 Slate基础概念 214
15.4.3 最基础的界面 214
15.4.4 SNew与SAssignNew 219
15.4.5 Slate控件的三种类型 220
15.4.6 创建自定义控件 222
15.4.7 布局控件 225
15.4.8 控件参数与属性 227
15.4.9 Delegate 228
15.4.10 自定义皮肤 234
15.4.11 图标字体 239
15.4.12 组件继承 241
15.4.13 动态控制Slot 244
15.4.14 自定义容器布局 248
15.5 UMG扩展 255
15.6 蓝图扩展 261
15.6.1 蓝图函数库扩展 261
15.6.2 异步节点 264
15.7 第三方库引用 270
15.7.1 lib静态链接库的使用 270
15.7.2 dll动态链接库的使用 273
第16章 自定义资源和编辑器 276
16.1 简易版自定义资源类型 276
16.2 自定义资源类型 278
16.2.1 切分两个模块 278
16.2.2 创建资源类 281
16.2.3 在Editor模块中创建工厂类 281
16.2.4 引入Editor模块 284
16.3 自定义资源编辑器 286
16.3.1 资源操作类 287
16.3.2 资源编辑器类 290
16.3.3 增加3D预览窗口 295