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提供了sluaUnLua插件,可以通过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++的很多功能,例如实时动态反射、序列化、垃圾回收、元数据等。而反射则通过如UCLASSUSTRUCTUFUNCTIONUPROPERTY等宏实现。

调试

Android真机调试

UE4使用Nsight Tegra,UE5使用AGDE,详情见文档。

日志

日志通过UE_LOG宏实现,可以用它在控制台上输出一些日志。此外UE还提供了可视化日志Visual Logger,通过在逻辑代码中以日志形式收集信息,然后将其绘制到编辑器上,也能存储为文件。

内置控制台

游戏内有内置控制台,方便开发者调试,在PC中按~键,在手机上用四指划屏。除了可以用stat fps查看帧率信息外,还能通过stat startfile/stopfile进行性能分析,并将其保存为文件,通过showbounds查看百位和。

RenderDoc

UE内置RenderDoc,可以通过控制台对游戏进行截帧分析。

Unreal Insight

这是UE新推出的性能分析工具,十分强大。