1 - UE入门
腾讯2024游戏客户端公开课笔记,UE入门部分。
游戏引擎简介
常见的游戏引擎
首先是虚幻引擎,堡垒之夜,和平精英,黑神话都是它做的。虚幻引擎的优势如下:
- 渲染品质:电影级别PBR渲染,着色模型先进;
- 美术制作:成熟的美术资产制作管线;
- C++与蓝图:性能与可视化脚本编程相辅相成;
- 开发周期:基于射击类的GamePlay框架,对该类游戏友好;
- 跨平台:一次开发,跨平台发布。包括移动端、主机端、PC端等;
- 开源:方便自己修改,社区贡献。
然后是Unity引擎,英雄联盟手游就是它做的。
还有CryEngine,寒霜引擎,Source2,Open 3D Engine,顽皮狗内部引擎,R星的RAGE引擎,动视的IW引擎,育碧的AnvilNext2引擎等。
什么是游戏引擎
游戏引擎是专门为游戏而设计的工具及科技集合,它由数据驱动,可重用且不包含游戏内容。它有如下特性:
- 通用性与偏向性
- 可拓展性
- 工具链的完善
渲染
渲染是游戏引擎中重要的一部分,游戏得先被“看见”才能玩。而渲染管线则是一些渲染流程的组合,例如:
- 延迟渲染:编辑器、PC、Console端的默认管线,支持的渲染特性层级是SM4,SM5;
- 前向渲染+:桌面VR游戏的默认管线,支持MSAA(因为不是延迟渲染),支持的渲染特性层级是SM5;
- 手机端渲染:可用 Tile Based 延迟渲染或前向渲染等,支持的渲染层级是ES2,ES3_1,Vulkan;
物理
物理则加深了游戏引擎对真实世界的模拟,一些中间件如下:
- Havok:支持物理、破坏、布料模拟、AI、行为、动画、FX等,对CPU友好。
- PhysX:曾集成与UE4和Unity,对GPU友好。
- Bullet:最早开源。
UE5则自己搞了个Chaos物理系统,它的场景破坏效果很震撼。
UE入门
学习资料
UE官方的Youtube网站,知乎网站和Bilibili网站。
Launcher
如果想要下载UE官方编译过的引擎,就要下载他们的Epic Launcher,其中有游戏商店、游戏库、以及虚幻引擎。
编辑器
UE的编辑器不仅仅是一个世界编辑器,它还管理整个游戏的资产数据,提供统一、实时、所见即所得的资产数据视图。
创建一个C++项目后,它的结构如下:
其中<Name>.uproject
说明这个项目是一个UE项目,<Name>.Target.cs
和<Name>Editor.Target.cs
则说明游戏和编辑器该如何配置,<Name>.Build.cs
则说明这个游戏项目需要UE的哪些模块。
项目打开后的编辑器页面如下,可见有许多部分:
有关项目资源的存放,UE资源为*.uasset
文件,存放在Content
目录下,非UE资源建议单独目录存放。此外还有引用其他项目资源的情况,这需要对要迁移的资源右键,Asset Actions,Migrate进行资源迁移。
此外,UE还对资源文件进行二次加工,让它们更易于自己使用,这种过程被称作 Derived Data Cache,它:
- 分离源数据和派生数据,例如优化纹理、着色器代码、网格信息等。
- 取消跨平台差异,例如平台不同导致格式不同的贴图文件,UE加载进来后转换为自己的内部格式;
UE资源的命名规范可在这里找到:
thejinchao/ue5-style-guide: 让Unreal Engine工程更加规范 (github.com)
项目结构
Project > Levels > Sub-Levels > Actors > Component
。
项目Project
项目是一个自成体系的单元,保存所有组成单独游戏的所有内容和代码,并于磁盘上目录相一致。有用的文件夹为Config,Content,Source,其他的为临时生成的,可以删掉。
世界World
世界,也被称作主关卡。它包含载入的关卡列表,可处理关卡流送和动态Actor的创建/生成。
关卡Levels
关卡是用户定义的游戏区域,可通过放置、变换及编辑Actor的属性来创建、查看及修改关卡。在UE编辑器中,每个关卡都被保存为单独的.umap
文件,也被成为”地图”。
子关卡Sub-Levels
如果单个关卡的游戏区域太大,可以将其划分为多个子关卡,艺术家可以互不影响地编辑各个子关卡,从而影响整个关卡。
Actors
可放入关卡中的对象都是 Actor,基类是AActor
。它默认没有SRT,需要引入相关组件。它通过SpawnActor()
方法创建,通过Destroy()
方法析构。
组件Component
组件是可添加到Actor的一项功能,它不能独立存在,需要将其添加到一个Actor中,这样Actor就能访问&使用该组件提供的功能。
组件化思想提高了可重用性,并且也提供了一些函数和事件供人们使用。例如:
- 场景组件:添加变换和附着信息;
- 图元组件:添加渲染和碰撞检测功能;
设置
一共有三种设置:
- 世界设置:对游戏地图方面的设置,例如是否要流式加载,游戏模式怎么规定等。
- 工程/项目设置:对游戏工程的设置,例如选择打包方式、玩家输入方式等。
- 编辑器设置:对编辑器相关的设置,例如中英文。
工程目录结构
一般工程文件的目录结构如下:
Engine # 存放引擎的所有代码, 内容和配置
+ Binaries # 引擎的可执行文件和DLL
+ Build # 构建引擎需要的文件
+ Config # 配置文件
+ Content # 共享的引擎内容
+ DerivedDataCache # 对Content的二次加工, 可删除
+ Intermediate # 暂时构建的产物, 可删除
+ Plugins # 共享&项目特有的插件
+ Saved # 自动存档, 本地配置, 截图等
+ Source # 引擎/项目的源代码!
-+ *.target.cs # 目标文件
-+ *.build.cs # 模块文件
模块
模块也分为许多类型:
- Developer:给开发者使用的
- Editor:给编辑器使用的
- Runtime:游戏运行时使用的
- ThirdParty:第三方代码
- Plugins:给编辑器,游戏使用的插件
- Program:游戏构建需要的
模块之间也有依赖关系,例如Runtime不能依赖Editor/Developer,但后者可以依赖前者。
一些重要的模块如下:
- Runtime/Engine:涉及到Gameplay框架的一些类
- Runtime/UMG,/Slate,/SlateCore:涉及到游戏UI的一些类
- Runtime/Core:引擎的底层核心类,例如文件管理等
UE编程技巧
游戏框架
UE的游戏框架如下,玩家受游戏模式和游戏状态的影响,通过PlayerController
去控制一个可操作物体Pawn
(如人、载具等),当然AI也能通过AIController
去控制一个Pawn
。
GameState是游戏状态,它包含要复制到游戏中的每个客户端的信息,例如游戏分数,比赛是否开始等。
Player则是玩家状态,例如个人得分,生命等。
Pawn是Actor的一个子类,充当游戏中的生命体。
Character是Pawn的子类,用作玩家角色,包括碰撞、双足运动的输入绑定、有玩家控制的运动附加代码等。
PlayerController是玩家控制器,在游戏中获取玩家输入并将其转换为交互信息。
游戏脚本(蓝图/Lua/C++)
蓝图
蓝图是UE官方提供的可视化编程脚本,它是一种特殊的uasset,在编译后会生成对应字节码,引擎运行时会读取字节码,并交由蓝图虚拟机去动态解释执行。可以用它实现游戏中一些简单的逻辑(例如开始有游玩/被击中的逻辑等)。
蓝图包括关卡蓝图,动画蓝图,材质蓝图等。其中一些蓝图可以继承蓝图或C++类成为蓝图类。
蓝图也能和C++类通信。首先是成员变量,通过给C++类中的成员变量加上UPROPERTY()
,就能通过蓝图去操控这个成员变量了。然后是函数,给C++函数加上不同的UFUNCTION()
,就能让蓝图和C++函数通信,包括:
BlueprintCallable
:C++中实现函数,蓝图调用;BlueprintImplementableEvent
:蓝图中实现函数,C++声明和调用;BlueprintNativeEvent
:C++中实现默认函数体,蓝图中可以选择重载。
Ps:C++函数体定义名称有格式要求:[FunctionName]_Implementation
。
蓝图一般用于数值配置,简单效果展示,实现简单逻辑(用一个屏幕范围内写好)。
Lua
腾讯为UE提供了slua
,UnLua
插件,可以通过Lua给游戏写逻辑。
C++
要想高效,还是得用C++。C++得通过UE编辑器中的C++类向导生成,如果手动新建会烧掉一些UE的反射宏。
编码规范详见:Epic的虚幻引擎 C++ 代码规范 | 虚幻引擎 5.5 文档 | Epic Developer Community | Epic Developer Community (epicgames.com)
UE中的C++也被称作U++,这是因为UE自己实现了一套专用于游戏引擎的高效标准库。
UObject
在U++中,万物皆UObject,它增加了标准C++的很多功能,例如实时动态反射、序列化、垃圾回收、元数据等。而反射则通过如UCLASS
,USTRUCT
,UFUNCTION
,UPROPERTY
等宏实现。
调试
Android真机调试
UE4使用Nsight Tegra,UE5使用AGDE,详情见文档。
日志
日志通过UE_LOG
宏实现,可以用它在控制台上输出一些日志。此外UE还提供了可视化日志Visual Logger
,通过在逻辑代码中以日志形式收集信息,然后将其绘制到编辑器上,也能存储为文件。
内置控制台
游戏内有内置控制台,方便开发者调试,在PC中按~
键,在手机上用四指划屏。除了可以用stat fps
查看帧率信息外,还能通过stat startfile/stopfile
进行性能分析,并将其保存为文件,通过showbounds
查看百位和。
RenderDoc
UE内置RenderDoc,可以通过控制台对游戏进行截帧分析。
Unreal Insight
这是UE新推出的性能分析工具,十分强大。