什么是UE?
UE(Unreal Engine)是EPIC为了呈现更好的游戏效果开发的一款游戏引擎,主要应用于游戏行业和视频制作。
UE5能实现什么功能?
* 可以进行实时渲染,实时合成,实时镜头捕捉
* 蓝图创作(无需代码)
* 包含完整的C++代码
* 灵活的材质编辑器及电影级材质处理效果
* 地形与植被,动画套件等
UE5主要分为渲染和开发方向。渲染主要是通过引擎实现更好的画面效果;而作为程序员,我们关注如何使用引擎实现一些项目需要交互的功能。
1.UE5引擎安装及Visual Studio2022环境配置
首先,UE5推荐配置
- Windows 10 64 位
- 64 GB 内存
- 256 GB SSD(操作系统驱动器)
- 2 TB SSD(数据驱动器)
- NVIDIA GeForce RTX 2080super及以上
- Xoreax Incredibuild(开发工具包)
- 六核 Xeon E5-2643 @ 3.4GHz
下载和安装 Epic Games启动程序(Epic Games Launcher)主页 - Epic Gameshttps://www.epicgames.com/site/zh-CN/home启动EPIC,进入虚幻引擎—库—加号选择安装版本
点击选项,选择需要的组件包
安装完成后可以启动引擎。但打开uproject工程文件时,如果出现以下问题,说明没有安装Visual Studio2022,在官网下载安装完成后,根据提示安装UE5支持包,即可运行。
2.创建项目
项目浏览器打开后,单击左侧的“游戏”按钮以查找可用于开始新项目的模板
1.右下Project Defaults可以选择蓝图开发模式或C++模式
2.目标平台:选择手机或平板会禁用一些后期处理效果。它还可以使用鼠标作为触摸输入。将此设置为Desktop。
3.质量预设:选择可缩放将禁用一些后期处理效果。将此设置为最大值。
4.入门内容:此选项包括一些入门内容。取消选中Starter Content以创建一个干净的项目。
5.光线追踪:这可以实现实时微妙的照明。不选中此选项。
6.最后指定项目文件夹的位置和项目名称。
3.导航界面
1.视口 此处为关卡视图,按住鼠标右键并移动鼠标环顾四周。要移动,按住右键单击并使用WASD键
2.模式选择 此面板可让你在景观工具和植物工具等工具之间进行选择。放置工具是默认工具。它允许你将多种类型的对象放置到关卡中,包括灯光和相机。
3.World Outliner 显示当前关卡中的所有对象。你可以通过将相关项目放入文件夹来组织列表,并且可以按类型搜索和过滤。
4.详细信息 选择的任何对象都将在此处显示其属性。使用面板编辑对象的设置。所做的更改将仅影响对象的该实例。例如,如果你有两个球体并更改一个球体的大小,则只会影响所选对象。
5.工具栏 包含多种功能,最常使用的是Play。
6.内容抽屉 此面板显示你的所有项目文件。使用它来创建文件夹和组织文件。你可以使用搜索栏或过滤器搜索文件。展开以显示项目中的所有资产。
4.文件结构
一般分为五个文件,分别是:
1.Config 包含了项目配置、键盘输入等配置文件
2.Content 存放引擎或游戏的内容,包括地图、材质、贴图、模型、蓝图等
3.Intermediate 编译时产生的临时文件
4.Saved 包含了自动保存内容、配置文件以及日志文件
5..uproject 项目启动文件
实际上,只需要Config、Content、.uproject三个文件即可,其余都可以删掉。
5.重定向文件
如果文件目录发生变化,如移动文件至另一文件夹后,需要重定向文件。右键点击被修改文件所在的文件夹,点击“修复文件中的重定向器”
6.放置Actor
Actor是放置在关卡中的对象,包括相机、静态网格、游戏关卡的起始位置等。这里简单介绍什么是相机和静态网格体。
摄像机(Camera)
代表了玩家的视角,比如玩家如何查看世界。PlayController会指定一个摄像机类, 并实例化一个Camera Actor (ACameraActor
),以此计算玩家从哪个位置和角度观察世界。
静态网格体 (static mesh)
用于在UE中创建关卡世界场景几何体的基础单元。它们是在第三方建模软件(如3dsMax、Maya、Softimage等)中创建的3D模型。可通过内容浏览器(Content Browser) 将之导入UE编辑器、保存到包内,然后通过多种方式来使用它们,创建可渲染的元素。
现在,我们将创建一种称为蓝图的特殊类型的Actor,它可以将网格组件组合成一个在游戏中使用的对象。蓝图比简单地加入 3D 模型更强大——它们还可以将复杂的逻辑与模型集成在一起,并共同创建可重用的部分以添加到游戏中。在最简单的意义上,蓝图代表一个“事物”。蓝图可让你为对象创建自定义行为。
右键点击 蓝图类——Actor 即可放置。双击新建的Actor,进入蓝图编辑器。
7.其他常用功能
1.查看官方文档
打开可查询不同版本的官方文档
2.高分辨率截图
3.资产迁移
8.蓝图编辑器
什么是蓝图?
蓝图是一种可视脚本,可用于创建逻辑,它称为可视化脚本,使用我们具有特点功能的节点来创建所有逻辑,这样,就无需使用C++代码即可创建逻辑,优点是无需编写代码即可快速创建逻辑,在不了解C++或者不是程序员的情况下创建项目,缺点是无非访问C++中的所有功能,且与C++相比,蓝图的性能较慢。
蓝图结构
执行顺序
蓝图节点
事件节点
红色的节点,例Event BeginPlay节点这种图表,表明这是一个事件节点
功能节点
蓝色并带有F的节点,例Print String ,表明这是一个功能节点
宏
灰色并带有工具图案的节点,如Macros Test,表明这是一个宏
脚本
紫色的是脚本,脚本是不能被删除的,它永远存在
函数
绿色带F的是函数,例Get Player Controller 这是一个获取角色控制器的节点
变量
单独的椭圆节点是变量
每个节点都有一个应用程序,我们已经看到了常用的几个,在后面将详细讲解,最重要的是需要理解,由于会经常在蓝图种出现,至少要通过颜色来区分他们,当看到就知道它们代表什么。
变量
什么是变量?
和其他编程语言一样,变量就是一个可以随时改变的值,它储存在内存中,需要时改变或读取其值。UE5中主要有以下几种变量类型:布尔型、整型、字节、float、int64、向量、旋转体、变换、命名、文本、目标等
如何创建一个变量?
点击左侧 变量 旁边的加号,选择变量类型,就创建了一个变量。按住鼠标左键将变量拖动至窗口,可以选择获取或者设置变量值。右侧细节界面可以更详细的设置此变量。
布尔型(boolen)
红色,逻辑判断类型,只能表示true或false两个值,默认初始false。默认值处勾选后为true。
整数(Integer)
海绿色,4个字节,32位,表示−2,147,483,648到2,147,483,647之间的整数值。
字节(Byte)
一个字节是8位,表示0与255之间的整数值(unsigned char)
Int 64
64位,表示−9,223,372,036,854,775,808与9,223,372,036,854,775,807之间的整数值(long
)
浮点(Float)
表示小数点后最多6位的小数
矢量(Vector)
表示在三维空间中的坐标(x,y,z),也可用4通道RGBY表示颜色。
旋转体(Rotator)
(F,Y,R) 分别表示三维空间中绕x、y、z轴的旋转值
变换(Transform)
包含矢量、旋转体、缩放的集合
字符串(String)
例如 Hello World
之类的一组字母数字字符(string
)。
命名(Name)
用于在游戏中识别事物的一段文本,一般用于给变量命名,速度是最快的。它不可操作,用法较少,如等于、不等于。
文本(Text)
向用户显示的文本,储存本地文本信息。下面介绍几种和文本有关的节点。
创建文本
大小写转换
移除空白字符
判断两文本是否相等(大小写)
判断文本是否来自字符串表
Out Table Id输出字符串表的存储路径 Out Key输出索引值 Return Value输出true或false
其余文本函数看介绍就知道大义
三种容器
主要有数组、集合、字典(映射)三种类型,下面将详细介绍。
数组(Array)
数组是同一种类型的数据的集合。在创建变量时,点击变量名称旁的图标即可创建数组。
数组索引
什么是索引?索引是用来快速访问数据库表格或者视图里的数据,需要存储空间。需要注意的,数组中的值的索引值是从0开始的 ,这意味着第一个索引是 0 而不是1。
Get(获取)
Get(获取) 节点取入一个数组和一个整型值,该整型值用作为索引编号。然后,它返回在索引编号处找到的数组值。
Add Item(添加项目)
Add Item(添加项目) 取入一个数组和一个变量。它将该变量插入到数组的尾部,并相应地增加数组的大小。
Clear(清除)
Clear 节点将清除相连接的数组中的所有数据,重置数组,并删除数组中的所有索引值。
Contains Item(包含项目)
Contains Item(包含项目) 节点允许搜索一个数组来查找特定项目。如果找到了该项目,那么该节点则输出True,否则会输出False。它不会返回找到的该项目所处的索引值。
Filter Array(过滤数组)
Filter Array(过滤数组) 节点取入一个类型为Actor(或其任何子项)的数组,并基于输入的Class(类)过滤该数组。所得结果是一个新数组,仅包含原始数组中和类的类型相匹配的项目。
Find Item(过滤项目)
Find Item(过滤项目) 节点取入一个数组和一个变量,然后查找在数组中第一次找到那个变量的值时该值所处的索引编号。
Insert Item(插入项目)
Insert Item(插入项目) 节点取入一个数组、一个变量值和一个整型值(索引编号)。然后,它把该变量的值插入到数组中的该索引值指定的位置处。
Last Index(最后一个索引值)
Last Index(最后一个索引值) 节点返回数组中最后一个值的索引编号。
Length(长度)
Length(长度) 返回数组的大小或数组中元素项的个数。如果数组中有 N 个对象,那么 Length 将返回 N , 而数组的有效索引值是从 0 到 N-1 。
Remove Index(删除索引)
Remove Index(删除索引) 节点通过使用项目的索引编号来从数组中删除那个项目。所有其他的索引编号将会自动更新来弥补该空缺。
Remove Item(删除项目)
Remove Item(删除项目) 将通过取入一个变量值来从数组中删除一个项目。如果在数组中找到了那个值,则删除它。所有其他的索引编号将会自动更新来弥补该空缺。这个节点具有布尔值输出,如果找到了该项目并将其删除了,则返回True。
Resize(调整大小)
Resize(调整大小) 节点将取入一个数组和一个整型值,该整型值为该数组的新的容量大小。如果调整大小后的数组小于原始数组,那么所有不适合调整后的数组的元素项都将会丢弃。如果调整大小后的数组大于原始数组, 则会在数组尾部添加空元素项。
Set Array Elem(设置数组元素)
Array Elem(数组元素) 允许您将一个数组的一个特定索引设置为特定的值。
集合(Set)
集合与数组的区别主要在于,集合中不能有重复的元素,且集合的处理速度比数组更快。集合没有get,如果想获取其特定值,需要通过To array转换为数组后再操作。
字典/映射(Map)
字典的定义,同样使用{},不过存储的元素是一个个的: 键值对(key不能重复,重复添加等同于覆盖原有数据)(通过字典可以通过key取出value)字典的key和value可以是任意数据类型(key不能是字典)。
Keys将字典中所有键值转换为数组,Values将数据值转换为数组,Find用于寻找与提供键对应的值。
小节
1.Array可以有相同元素,Set和Map不能有相同元素
2.Set和Map的速度大于Array(二叉树),但Array自由度高
3.Map用于数据对;Set用于数据的布尔运算;Array用于储存数据集合
循环
branch
分支,类比if()语句。condition不勾选时,condition处输入真执行true,假执行false。
for each loop
循环,类比for()语句。Exec为开始执行,Loop Body为循环体,Array为要循环的数组,ArrayElement为数组中该数据的值,Array Index为索引值,Completed为循环结束。
for loop
指定循环开始和结束的索引
for each loop with break
带有打断的for() 当Break执行时跳出循环至Completed
revere for each loop
数组倒叙从后往前循环
while loop
类比while()语句,condition用于判断何时结束循环
流程控制节点
Sequence
按顺序执行
Do N
执行给定次数N,执行完N次后必须触发Reset才能执行下N次。
Do Once
只执行一次 Reset后再执行一次
Do Once MultiInput
多通道只执行一次
Flip Flop
在A、B之间循环执行,若执行A输出true,B输出false。
Gate
门打开时执行,关闭时不执行。Taggle为在开、关之间循环。
MultiGate
Index指定从哪个out开始执行;Reset复位;random随机,若勾选此项,将随机从哪个out开始执行;loop循环如果勾选,将按照执行顺序循环执行。
Retriggerable Delay
无需复位,每执行一次,延时指定事件后,再执行后续操作。
Delay Until Next Tick
这一帧不执行,下一帧才开始执行。
结构体和枚举
结构体(Struct)
结构体是数据集合,而数据可以是变量,也可以是容器。
获取结构体值用Break
枚举(Enum)
官方一点说,枚举是具有不可变性的可被列举的集合(不能无穷)。通俗来说,枚举就是一个一个列出来。理论上可以用来代替枚举类的方法有很多种,如字典,但都存在着一些问题:
1.枚举值可以修改 (别人随便改岂不是很危险)
2.用类定义的话,这些枚举功能的类可以被实例化
3.枚举值是否重复无法检查 (这玩意写错了再调错了完蛋)
因此,使用枚举有以下优点:
1.不能被继承
2.定义之后不能在类内修改
3.枚举名称不能重复(这点和字典倒是一样的)如果名称重复则会覆盖
4.使用@unique可以识别值是否重复
在UE5中,枚举一般搭配switch使用,只运行指定的。
事件、函数、宏、事件分发器
事件
右键添加节点,在“添加事件”一栏中,显示出了UE5自带的事件,如事件开始、事件结束、事件销毁、事件Tick(每帧执行)等。也支持自定义事件,自定义事件可以在函数中被调用。
函数
除了UE5提供的函数外,也支持自定义函数。
宏
宏可以有多个输入执行Exec和多个输出执行Exec,也可以有多个输入和多个输出。本质上,宏和函数都是为了封装代码,但是宏的代码封装能力要强于函数。因为函数只能有一个输出,如果需要两个或多个输出时,可以使用宏做一些简单的运算。
事件分发器
创建事件分发器
事件分发器的作用
发信者利用事件分发器 发送消息给世界;发信者无法从接收者那里获取到任何信息即返回值、也不知道谁收到了消息;带有信息接收器的人,会接受到该消息并执行后续动作,比如:BOSS死亡引起灯灭、草燃、音乐停、重见天日等。事件分发器作为一种常用的蓝图通信节点,在下节将详细介绍。
常用的蓝图通信方式
蓝图间通信是蓝图通信的一部分。它们各自都有很多种方法来实现需求。对于蓝图间通信而言,我们要学习的不仅有通信方法,还有通信方式。从通信方法来看,蓝图间通信五花八门,有很多组合方式。但从通信方式来看,蓝图间通信只有两类:一类是一对一通信、另一类是一对多通信。
1.直接引用
直接蓝图间通信的本质是一对一通信。直接蓝图间通信用一句话概括就是:蓝图A通知场景中的蓝图B执行某个流程。对于蓝图A而言,它可以是场景中蓝图(Blueprint Actor),也可以是关卡蓝图(Level Blueprint)。对于 蓝图B 而言,它必须是一个场景实体(Actor)。因为通信一词也暗含了“两个对象之间发生的某事”这一意义。
对于蓝图A想要找到蓝图B而言,它也需要先找到蓝图B所属的类型(Class),例如蓝图B属于类型K,如此才能缩小检索范围,定位蓝图B的准确对象。对于蓝图A 来说,仅仅锁定 蓝图B 所属类型也不够,蓝图A 需要指认类型K中特定的 蓝图B,而不是蓝图C、蓝图H或蓝图X。所以可以通过以下流程实现这一查找过程:(从本质上来说,每个蓝图都是一个类,上图中的 BP_A_Child 就是 BP_A 派生出的一个子类。我们从场景中收集 BP_A Actors,然后再在 BP_A Actors 中筛选 BP_A_Child,最终找到 BP_A_Child Actor。)
2.事件分发器
事件分发器是名副其实的一对多通信。可以把事件调度器想象成一个插线排座,不同的蓝图可以在上面自由绑定或解绑 一个个自身的事件(Event),当我们给这个插线排座通电时,目前绑定在这个排座上的事件都会被激活。
事件调度器很适合用于整合不同蓝图对于同一个事件的不同反应。将蓝图BCD... 对于在蓝图A中的事件X 发生时做出的反应事件,绑定在蓝图A的事件X调度器上,如此,当蓝图A的事件X被触发时,蓝图BCD...中的相应事件也会被触发。
事件调度器是一个非常方便和灵活的通信功能,我们甚至可以在每次激活事件调度器后,对其上的系列事件进行重新解绑和绑定,这样下次再激活事件调度器时,执行的又是不同的事件。
3.蓝图通信接口
蓝图通信接口乍一看上去与直接蓝图间通信差不多,都是一对一通信。一个蓝图接口可以包含多个接口函数,接口函数能够在设置了该接口的蓝图中,被调用和作为事件引用。接口函数约定了蓝图在使用该接口函数时应该提供的输入数据,以及输出数据,但自身并不具有具体实现逻辑。不同的蓝图类在使用同一种蓝图接口函数时,可以在蓝图自身内部覆写该函数的具体实现逻辑,以实现该接口函数在不同蓝图中各自不同的功能。
同时,蓝图通信接口还拥有较高的宽容度,你并不需要在意目标蓝图是否设置了该接口,是否实现了该接口函数,以及如何实现该接口函数。即使调用的目标蓝图并没有该接口或没有实现该接口函数,程序依旧会保持静默,因为这只是表示该次通信无效。