新書推薦:
《
古典的回響:溪客舊廬藏明清文人繪畫
》
售價:NT$
1990.0
《
根源、制度和秩序:从老子到黄老学(王中江著作系列)
》
售價:NT$
550.0
《
索恩丛书·北宋政治与保守主义:司马光的从政与思想(1019~1086)
》
售價:NT$
345.0
《
掌故家的心事
》
售價:NT$
390.0
《
农为邦本——农业历史与传统中国
》
售價:NT$
340.0
《
郊庙之外:隋唐国家祭祀与宗教 增订版 (三联·哈佛燕京学术丛书)
》
售價:NT$
480.0
《
小麦文明:“黄金石油”争夺战
》
售價:NT$
445.0
《
悬壶杂记全集:老中医多年临证经验总结(套装3册) 中医医案诊疗思路和处方药应用
》
售價:NT$
614.0
|
內容簡介: |
本书以两位作者本人在使用虚幻引擎过程中的实际经历为参考,包括三大部分:使用C语言进行游戏性编程、了解虚幻引擎本身底层结构与渲染结构、编写插件扩展虚幻引擎。提供了不同于官方文档内容的虚幻引擎相关细节和有效实践。有助于读者一窥虚幻引擎本身设计的精妙之处,并能学习到定制虚幻引擎所需的基础知识,实现对其的按需定制。
|
關於作者: |
罗丁力:电子科技大学在读学生、腾讯课堂三巫教育课程作者。自UDK开始使用虚幻引擎,有多年的虚幻引擎使用经验。
张三:多年游戏开发经验,资深UE4开发者,三巫社区创始人。
|
目錄:
|
目录
第一部分 虚幻引擎 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 Intel TBB 内存分配器 . . . . . . . . . . . . . . . . . . . . . . . . . . 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::read . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 渲染代理的
|
內容試閱:
|
前言
建德若偷,质真若渝。大方无隅,大器晚成。
大音希声,大象无形。夫唯道善贷且成。
老子,《道德经》
虚幻引擎作为业界一流的次时代引擎,开发了无数成功的作品。在短暂的计算机图形学发展历史上,虚幻引擎历经四代,成为游戏引擎界举足轻重的成员之一。
但是虚幻引擎庞大而复杂的设计,阻碍了许多人学习的步伐。尽管有蓝图系统作为图形化编程,降低了虚幻引擎的上手难度,但是当开发者们走入虚幻引擎的 C 范畴,依然会感觉到无从下手。
因此,我决定和我的同事一起来撰写本书。希望能够借助我们微薄之力,帮你理解庞大的虚幻引擎是如何工作的。笔者对本书内容的期望是,这是一本笔者在学习虚幻引擎时希望能够获得的书。
同时也请明白,虚幻引擎的代码量为五百万行。本书篇幅不足以分析整个虚幻引擎的所有模块,也无法精确地向读者展示每段代码的意义。相反地,本书立足于:展示引擎基本结构,即尽可能告诉读者它是这么跑起来的,对于希望精确研究每一段代码过程的读者,本书会告知你如何寻找到对应的代码。本书主标题为大象无形,《道德经》中有言:大器晚成,大音希声,大象无形。本书取伟大的设计对于使用者来说似乎感觉不到存在和优秀的系统设计让开发者不需要过多了解原理即能使用这样的含义。对于虚幻引擎而言,本书中介绍的很多知识,对于普通开发者来说似乎是没有感觉到存在的东西,例如引擎的渲染系统,普通开发者几乎只需要简单地完成导入和摆放就能使用,并不需要实际了解渲染系统的工作原理。能够达到这样的效果,恰恰说明了虚幻引擎设计的优秀:能够让开发者不需要了解系统的机制,就能够快速使用其来完成自己的需求,此即无形。然而这样优秀的设计是如何完成的?如何扩展这样的设计来让开发者完成自己独特的需求?这是本书希望探讨的内容。
本书由两位作者共同编撰而成,其中罗丁力先生完成了第一部分(除《引擎系统相关类》章节)和第二部分,以及第三部分中《引擎独立应用程序》《自定义资源和编辑器》章节,张三先生完成了第二部分中《引擎系统相关类》章节与第三部分中《插件开发》章节。
笔者才疏学浅,撰写本书仅仅为个人一家之言。欢迎每一位读者对本书提出建议和指正,也欢迎更多的人去撰写虚幻引擎相关的书籍,共同为虚幻引擎的推广、运用做出努力。你可以发送邮件到 three@sanwu.org。
感谢 Unreal Engine,陪伴我度过了最美好的青春。
阅读之前
你好,欢迎你阅读本书。在这里我希望能向你讲述一些关于阅读本书的约定。首先,这不是一本虚幻引擎入门宝典或是虚幻引擎从入门到精把视角集中到那些市面上的教程没有涉及的领域,所以我们不会教你:
1 如何下载引擎
2 如何安装引擎和 Visual Studio
3 如何更新引擎
4 如何申请虚幻引擎账户
我们假定你已经掌握这些知识。并且我们也不会教你:
1 C 语法
2 C 语言语法
我们认为你在使用虚幻引擎的 C 语言进行编程之前,已经掌握了 C 的基础语
法,包括函数、变量、类、指针与模板。当然,我们会向你解释虚幻引擎中的独有的C成分,包括 C11 标准的一些内容。
如果你已经做好了准备,欢迎开始你的阅读之旅。本书分为以下三个部分:
虚幻引擎 C 编程 这个部分简单介绍虚幻引擎的 C 编程方式,你可以通过这个部分回顾、整理你从官方文档学习到的有关使用虚幻引擎进行编程的知识,并给出了一部分官方文档尚未介绍但可以被使用的库、API 与技巧。虚幻引擎浅析 这个部分将会引导读者去研究虚幻引擎源码,并给出笔者认为在深入使用虚幻引擎进行游戏开发的过程中,可能会需要具备的引擎架构、模块如何工作的知识。换句话说,这个部分介绍虚幻引擎是如何工作的。
扩展虚幻引擎 这个部分则是通过介绍虚幻引擎的插件编写,将第二部分的知识运用起来,让读者不至于觉得这是 屠龙之技,虽有思辨的乐趣,却没有用武之地。进而赋予读者定制虚幻引擎以符合自己游戏实际情况的能力。笔者认为这是专业游戏开发者所需要具备的技能。
在每一小节开头,笔者会提供一个常常被问及的问题,然后根据这个问题来阐述接下来的内容,就像这样:
问题
我该如何学习虚幻引擎?
读者可以在阅读完每一个小节后,回顾小节开头的问题,以检验自己是否已经理解了本节的内容。
笔者在这里衷心地祝愿你找到你希望学习的知识,祝你一切顺利!
鸣谢
本书在撰写过程中受到了大量同行、朋友及亲人的帮助,有许多同行无私地贡献了自己的想法、意见及自己宝贵的经验,在此对他们表示真挚的感谢:
非常感谢 NetFly 和秦春林先生对本书的支持,他们不仅帮助笔者联系了本书的出版社,也非常认真地审阅本书的稿件,并给出了中肯有效的意见,没有他们的帮助,本书不可能出版。
非常感谢傅建钊先生对本书的帮助,提出了大量有效的意见,并组织了相当多的业内人士共同讨论本书的主题,他的知乎专栏《Inside UE4》对虚幻引擎的剖析同样非常精彩,建议读者可以参考。
同时,也有不少同行针对书中许多主题给出了自己独到的见解,并被整理到书中。LSFW 先生给笔者多次反复讲解渲染框架设计,贡献出了自己对渲染系统的研究成果;黄河水先生、Dest1ny 先生撰写了大量博客来分析虚幻引擎的底层架构,给笔者启发颇多;王德立先生帮助本书绘制了插图。还有许许多多同行,在此恕无法一一举名。
感谢三巫社区和 Epic Games 对本书的出版过程的支持与帮助。
最后,作者之一罗丁力希望感谢 Black Rock Shooter,感谢她在撰写本书的过程中,对其鼓励与陪伴。
|
|