游戏引擎实际上是一个集成了各种游戏开发工具、封装底层并提供程序函数库的软件系统。
游戏引擎架构系统分层
虽然引擎技术复杂,但经过多年来的不断迭代,大多数商业引擎已经拥有非常完善的编辑系统、良好的交互体验、详细的文档和丰富的开发功能。 学习门槛的降低也让更多的人乔布斯参与其中(也诞生了越来越多的独立游戏)。 以下列出了游戏开发中的常见职位和两种常见的协作开发流程:
其实学习游戏引擎的前期对于任何职位都是相似的。 基本上是一个熟悉基本操作、了解基本概念、拓展专业知识的过程。 但到了后期,程序员需要有更多的思维和知识储备。 他们需要从代码层面去理解,进一步达到能够独立编写的状态。 下面我分享一下我这几年学习引擎的经验。 我希望它能帮助你。
准备阶段:引擎选型、语言基础、计算机基础
我接触过Cocos、Cryengine、Unity、Unreal。 其实经过这么多年的发展,各有各的适合的领域。 当然,也有很多值得批评的地方。 用一句话来评价谁好谁坏是不现实和不负责任的(事实上,每天都有人抱怨UE耦合的Gameplay和蓝图不好维护,抱怨Unity一堆半成品的功能,资源加载慢、Mono效率低等)。
在我看来,大多数人只需要考虑学习引擎的成本、就业难度、发展方向就可以了。 考虑到目前的就业情况以及对市场影响最广的,Unity和Unreal就是这两个,所以我只推荐这两个。
然而,这两个引擎从一开始就给开发者提出了一个难题:我应该学C#还是C++?
如果你是学生,有时间慢慢学习,那么更推荐Unreal。 开源代码有更多的研究空间,学透C++有很多好处。
如果你想尽快找到工作或者快速出成品,Unity确实上手比较快,而且C#也比较友好。
当然贴图笔刷,这也不是绝对的。 任何发动机的初始阶段和完成阶段都是相似的。 不过,Unreal的学习曲线可能有点曲折(C++占很大因素),某个阶段的挫折很可能会影响开发者学习的动力和进度。
不管怎样,学习语言和读书是唯一的出路。 无论朝哪个方向发展,都要静下心来读一两本经典书籍。 例如,对于C++,入门和扩展有《C++ Primer》、《Effective C++》、《C++语言的设计与演变》,进阶的有《C++Template》、《In- 《深度探索C++对象模型》、《更有效的C++》,对虚幻引擎C++进行了魔法修改。 如果你专注于编写游戏逻辑,你确实不会使用太多的C++特性,但考虑到未来的增长,你仍然需要尽可能深入。 C#书籍,《C#图解教程》、《C#精要》、《C#进阶教程》、《深入理解C#》、《CLR via C#》,如果你是一个完全的新手,那么就先看一本书吧,其他的慢慢消化。 还有一点,语言的本质是殊途同归,真正的老板不会拘泥于某种语言。
除了语言之外,还有一个更重要的预备知识——计算机基础。 计算机基础水平决定了你未来的发展速度和天花板(也是专业出身的优势),所以强烈建议学好一门语言,不断巩固操作系统、计算机网络、数据等专业知识结构和算法。 我一直很遗憾自己在本科的时候没有深入了解这些内容,所以在这些年的工作中我一直没有停止过对操作系统知识以及其他知识的学习。 这对很多人来说是一个漫长的过程,所以我们可以在后续的工作中慢慢巩固。
关于这些知识的意义,一个更直观的例子是,它们通常可以帮助我解决各种疑难杂症,比如:
发生崩溃但堆栈信息不准确(汇编可以帮助我们定位)
本地编译可以通过,远程编译不能(可能是宏定义或者UnityBuild导致的)
手机直接死机,没有任何堆栈信息(可能是内存问题)
字符串莫名其妙出现乱码,并且Debug版本和Shipping版本表现不一致(编译器优化问题)
如果不掌握基本的计算机知识,很难找到这些问题的解决方案。
第一阶段:熟悉游戏开发,学习引擎编辑器的基本操作
如果你从来没有接触过任何引擎,也没有相关的技术积累,那么无论你处于什么职位,你都应该静下心来,把它当作一个普通的软件来学习。 此阶段的目的是熟悉发动机的基本操作。 方法是找一本入门教学视频/入门书籍,跟着学。 如果有不懂的地方,直接去搜索引擎(或者官方文档),尝试了解引擎中的一些基本概念。 比如Unity中的GameObject、Component、Script或者Unreal中的actor、Component、Blueprint等(一个月就够了)。 很多专家总是对教程或视频嗤之以鼻,但在我看来,视频教学确实是最快、最容易理解的解决方案。
如果您有一定的相关经验和积累,可以跳过上述步骤,直接尝试编写demo,无需教程。 小心不要一次急于完成所有演示。 选择一个你感兴趣的方向,并尽可能地改进它。 你的收获将会更大。 比如你要做一个横版跳跃、一个简单的RPG或者一个ACT项目,不同的项目有不同的侧重点,所以你可以提前有个大概的了解。 另外,脱离教程并不意味着脱离项目。 教程(或者官方案例)中的项目代码、蓝图等还是有很大参考意义的。 当你实现Demo的时候,需要多对比、多学习,才能真正理解它的意图。 良好的优化和改进。
Unreal和Unity的编辑器界面其实非常相似。
第二阶段:补充游戏专业知识,了解基本原理
当你可以轻松配置预制件、编写脚本、轻松绘制蓝图并实现演示时,就不再愿意做熟练工了。 接下来编写一个游戏引擎,我们需要开始添加相关的专业知识,并尝试了解每个模块和您常用的每个资源背后的含义。
当你把一个Prefab拖进场景或者打开蓝图的时候,你不妨想想它是什么? 为什么模型分为静态模型和骨架模型而不是动态模型? 为什么骨骼模型的出现称为蒙皮?
现阶段可以配合官方文档索引相关技术概念,如动画系统中的IK、Montage、BlendSpace、骨骼动画、蒙皮动画等。 然后您可以使用这些概念来搜索相关书籍、论文、视频等。 通过这样的拓展,你的知识图谱将会快速打开和丰富。
关于动画系统的书籍有哪些——《Character Animation With Direct3D》
动画系统一般包括哪些技术——骨骼蒙皮动画、Morph动画、状态机、Ragdoll、Root Motion、IK
骨骼蒙皮的技术原理——Mesh按照权重绑定到骨骼上并递归移动
动画系统有哪些前沿技术——Motion Capture、Motion Match、Path Warpping等?
(其他模块类似,如果时间充裕,建议系统学习,整理本模块相关知识)
另外,你应该重新打开工程项目和引擎,开始尝试深入研究一些成熟项目(引擎)的代码。 了解了一些专业概念后,最好深入代码看看是如何实现的。 这个时候你的理解会比第一阶段更深。 例如,组件如何附加到对象上并生效? 动画蓝图本质上是什么? 这个动画数据是怎么传递的呢? 这时候你可以尝试对源码进行梳理和分析,一一解决你的问题。 建议合理利用堆栈信息、绘图工具、断点调试等手段进行辅助。
这个阶段其实是相当困难的。 除了专业知识之外,你还会遇到各方面的困难。 比如数学物理基础知识、语言特性、系统原理、编译调试方法、各种bug等都一一解决。
以上不仅仅适用于程序。 其实,作为一个合格的策划/美工,即使不读源码,至少也需要把官方文档研究透,通过一些视频或者书籍了解一些系统的基本原理。 只有真正了解了这些,你才能真正感受到自己的进步和成长,以后面对这些系统也会更加坦然。
但考虑到现代发动机如此复杂和庞大,有必要逐个模块地学习吗? 答案是否定的,毕竟人的精力是有限的。 尽管我已经使用引擎五年了,但仍然有很多模块我几乎没有接触过。 并不是它们不重要,而是它们不在我的规划目标之内。 因此,一定要规划好自己的发展方向和感兴趣的内容,然后查阅、研究相关资料。
第三阶段:代码培训(针对程序员)
这个阶段,你对引擎的某些模块有了专业的理解和思考。 下一步是使用和改进它们。 这个时候游戏运营,仅仅看书、看资料已经不够了。 你需要阅读相关源码或者demo来加深理解,并尝试编写一些复杂的代码模块。 这一步实际上是对第二步的补充。 在查阅各种资料的同时,你可以开始模仿一些相关的代码,根据自己的需要进行扩展。
比如说,如果你从《网络多人游戏架构与编程》这本书上了解到什么是帧同步、状态同步,那么当前的引擎采用的是什么方法呢? 可以转换成另一种方式吗? 困难是什么?您可能需要以下能力
计算机网络基础
TCP/UDP 套接字编程
序列化的实现与应用
了解各个模块的引擎tick和更新逻辑
C++中的一些常用语言技巧
操作系统内存知识
复杂模型的抽象能力
再比如,如果你了解了AI中基本的寻路算法和行为树概念,你知道它们在引擎中是如何实现的吗? A*算法是否集成在引擎中? 如何将复杂的场景分解为网格并应用A*? 你能自己写一个简单的行为树吗? 这些都是我们学习引擎、拓展思路之后需要思考和解决的问题。
在写这些代码的时候,你会遇到各种各样的问题,不仅可以锻炼你的编程能力,还可以提高你个人的编程素养和计算机素养。 很多以前看似高端、理解不透的知识点也将逐渐被消化和关联,比如内存池和内存管理、无锁编程、异步编程、Hook技术、游戏安全等。
另一方面,我们的大脑会不断地对其进行抽象,引擎的代码结构也会逐渐清晰。 渐渐地,我们就能真正理解模块的结构和意义了。 当然,如果你保持画图、分析、写笔记和总结的习惯,这个过程会更顺利。
个人绘制的一些架构图
一些个人笔记的目录
第四阶段:脱离引擎(针对程序员)
这个阶段我们基本上已经和引擎脱离了。 我们更多的是从程序的角度思考架构和实现方法,思考如何将更先进的理论思想(包括架构方法和专业论文知识)应用到我们的环境中。 你可以尝试看不同引擎的源码,参考不同的开源项目和论文,开始比较不同引擎的优缺点,并尝试自己实现和优化。 在不断磨练自己编码技能的同时,也在加深自己在某个方向的专业能力。 和架构能力。 慢慢的,你就会有自己的一套思维理论(比如我习惯先跑流程,理清概念再关注数据存储方式)。 通过打开引擎的源代码,您也许可以猜测哪些模块做什么。 它的结构大致是什么样子编写一个游戏引擎,如何获取运行时类型,资源管理方式是什么,GC方式是什么,Tick更新的顺序是什么,如何封装和应用多线程等等。这次,您选择 Unity 还是 Unreal? 从个人能力上来说,似乎并没有太大的区别。
然而,你要成为游戏开发各个方面的专家仍然很困难。 如果改变方向,可能需要再次走相似的路径(当然会快很多)。 另一方面,各个领域的技术都在不断进步。 科研界从未停止产出论文(如年度 siggraph、近年来深度学习与游戏 AI 的结合),业界也从未放弃。 尽管我们正在放慢新技术投入生产的步伐(例如DX12和Vulkan的进步),但我们的学习不能停止。
以上是我关于引擎学习的一些经验分享。 当然最后一个阶段在某种程度上超出了我的能力范围,也算是我后续发展的一个方向。 总的来说,多思考、多提问、多查资料、多写代码、多总结。 只要坚持,每个人都可以成为优秀的开发人员。