什么是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 Gamesicon-default.png?t=N7T8https://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.查看官方文档

打开可查询不同版本的官方文档

搜索 - Unreal Engineicon-default.png?t=N7T8https://www.unrealengine.com/zh-CN/bing-search?x=0&y=0&filter=%E6%96%87%E6%A1%A3&keyword=%E7%9B%B8%E6%9C%BA

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(删除索引) 节点通过使用项目的索引编号来从数组中删除那个项目。所有其他的索引编号将会自动更新来弥补该空缺。

Array_RemoveIndex.png

Remove Item(删除项目)

Remove Item(删除项目) 将通过取入一个变量值来从数组中删除一个项目。如果在数组中找到了那个值,则删除它。所有其他的索引编号将会自动更新来弥补该空缺。这个节点具有布尔值输出,如果找到了该项目并将其删除了,则返回True。

Array_RemoveItem.png

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.蓝图通信接口

蓝图通信接口乍一看上去与直接蓝图间通信差不多,都是一对一通信。一个蓝图接口可以包含多个接口函数,接口函数能够在设置了该接口的蓝图中,被调用和作为事件引用。接口函数约定了蓝图在使用该接口函数时应该提供的输入数据,以及输出数据,但自身并不具有具体实现逻辑。不同的蓝图类在使用同一种蓝图接口函数时,可以在蓝图自身内部覆写该函数的具体实现逻辑,以实现该接口函数在不同蓝图中各自不同的功能。

同时,蓝图通信接口还拥有较高的宽容度,你并不需要在意目标蓝图是否设置了该接口,是否实现了该接口函数,以及如何实现该接口函数。即使调用的目标蓝图并没有该接口或没有实现该接口函数,程序依旧会保持静默,因为这只是表示该次通信无效。

蓝图的封装与继承

组件

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐