2 - 初见蓝图编辑器
希望我能尽快入门UE5!本章将介绍虚幻引擎蓝图的相关内容,在本篇中我将学到:
- 蓝图是什么,和C++的区别
- 蓝图编辑器以及有关基本操作
通过虚幻5官方的“第三人称模板”来学习。
蓝图简介
概念
在UE5中,蓝图这个词可以用来指两种不同的概念:
- UE5的可视化变成语言;
- 特定类型的资产,即蓝图类/蓝图资产。
和C++的区别
之前说过,Actor是一个可以放置在关卡中的对象。这个对象可以是C++类的一个实例,也可以是蓝图类的一个实例,两者都必须直接或间接地继承蓝图类。
C++类和蓝图类的区别如下:
- 如果将编程逻辑添加到C++类中,将获得比创建一个蓝图类更高级的引擎功能。
- 在蓝图类中,我们可以轻松地查看和编辑该类的可视化组件,例如3D网络或触发框碰撞,以及修改在C++类中定义并公开给编辑器的属性,这使得管理这些属性变得更加容易。
- 在蓝图类中,可以轻松引入项目中的其他资产;在C++类中也可以,但操作比较麻烦。
- 运行在蓝图可视化编程上的编程逻辑在性能方面比C++类慢。
- 在版本管理方面,C++类可以进行多人协同;而蓝图类被解释为二进制文件不是文本,多人协同会发生冲突。
创建蓝图Actor
创建蓝图类的步骤很简单,如下:
- 在内容浏览器中的“内容/ThirdPerson/Blueprints”中右键新建一个蓝图类;
- 在选取父类中选择要继承的C++类或蓝图类,这里选择继承Actor类;
- 给蓝图类起名,这里是”TestActor”。
双击新建的蓝图类,即可进入蓝图编辑器。
蓝图编辑器的界面布局
蓝图编辑器是UE5编辑器中的一个子编辑器,专门用于编辑蓝图类。在这里可以编辑蓝图类或其父类的属性、逻辑,以及它们的可视化外观。
蓝图编辑器的界面如下:
来看看界面布局:
- 视口:位于正中间,和关卡编辑器中的视口类似,可以可视化Actor并编辑其组件。此外视口其实是选项卡,还有“事件图表”选项卡和“Construction Script”选项卡,待会介绍。
- 组件:位于左上角,Actor可以有几个Actor组件,在这里可以添加和删除那些组件,或访问它继承的C++类中定义的Actor组件。
- 我的蓝图:位于左下角,在这里可以浏览、添加和删除蓝图类及其继承的C++类中定义的变量和函数等。需要注意的是,蓝图有一种被称为 事件 的特殊功能,用于表示游戏中发生的事件。这里有三个事件:BeginPlay,ActorBeginOverlap 和 TIck,待会介绍。
- 细节:位于右边,和关卡编辑器的细节面板类似,该面板用于显示当前选定的Actor组件、函数、变量、事件或该蓝图类中任何其他单个元素的属性。
- 工具栏:位于顶部中央,可以编译蓝图类中编写的代码,保存代码,定位代码等。
此外,在右上角可以看到当前蓝图类的父类,点击它可以转到相应的蓝图类/C++类。如果想更改父类,可以在左上角文件中选择重设蓝图父项。
事件图表选项卡
在这个选项卡中,我们可以编写所有的蓝图可视化编程代码,创建变量、函数,以及访问在该父类中声明的其他变量和函数。
在事件图表选项卡内右键单击以访问蓝图的操作菜单,该菜单允许访问可以在“事件图表”选项卡中执行的操作,包括获取&设置变量,调用函数/事件等。
引脚
在蓝图中,脚本的工作方式是通过引脚连接节点,节点包括变量、函数和事件等几种类型,可以通过引脚连接这些节点。引脚有两种类型:
执行引脚:这些引脚决定节点的执行顺序。例如下图,先执行节点1再执行节点2,需要将节点1的输出执行引脚和节点2的输入执行引脚连接。
可变引脚:节点左侧的引脚是输入引脚,作为参数输入;节点右侧的引脚是输出引脚,作为返回值输出。
创建蓝图变量
在蓝图中,变量的工作方式与C++中使用的变量类似。可以创建变量,获取它们的值,或者是设置它们。创建蓝图变量的过程如下:
- 在”我的蓝图“面板单击”变量“右侧的加号,然后可以重命名变量,这里是
MyVar
; - 单击工具栏左侧的编译,编译蓝图;
- 编译后在”细节“面板上就会出现变量
MyVar
的属性,可以进行设置它的值; - 在”我的蓝图“-组件中单击该变量,可以在”细节“面板上修改该变量的详细信息。包括 变量命名,变量类型 和 默认值。
创建好蓝图变量后,就能在蓝图中获取/设置它了。在”我的蓝图“-组件中选中该变量,拖到蓝图编辑器后出现获取和设置两个选项:
- 获取
MyVar
:包含变量当前值的节点; - 设置
MyVar
:允许更改变量值的节点。
此外,”我的蓝图“-组件的该变量右侧有个眼睛符号,它决定我们能不能从外部关卡编辑器的”细节“中设置它的值。
创建蓝图函数
在蓝图中,函数和事件类似,区别是事件只有一个输出引脚,因为它通常从蓝图类外部被调用。
创建蓝图函数的步骤如下:
点击”我的蓝图“-函数中的加号;
命名新函数,这里是
MyFunc
,然后编译;然后就能在”细节“中设置与此函数相关的所有属性了:
其中最重要的是”输入“和”输出“,这两个属性将指定此函数必须接收并返回的变量,这里输入一个布尔值,然后总是返回
false
:别忘了先编译后保存蓝图函数,如果想在编译完成后自动保存,需要在编译右边的三个点中选择仅在成功时保存。
算术节点
蓝图包含更多与变量/函数无关的节点,接下来介绍算术节点,以乘法Multiply
为例:
此节点可以输入两个或多个参数,这些参数可以是多种类型(整数、浮点数、向量等,可以通过单击”添加引脚“右侧的加号添加更多参数),并输出所有参数相乘的结果。
BeginPlay和Tick事件
BeginPlay事件:当这个蓝图类的实例被放置在关卡中,关卡开始播放时,或者当这个蓝图类的实例在游戏正在播放时被动态生成,就会调用该事件。可以用来做一些初始化操作。
Tick事件:游戏以一定的帧率运行,此事件将在游戏的每一帧被调用。
Tick事件将使用参数Delta Seconds
进行调用,此参数是一个浮点值,表示从上一帧渲染后到当前帧经过的时间。假设有个蓝图类,每次使用Tick事件渲染帧时,它都要朝+Z走一个单位,如果不用Delta Seconds
乘以这个单位,就会导致60帧运行游戏的玩家比30帧运行游戏的玩家看到的速度快两倍。
BP_ThirdPersonCharacter 蓝图类
这个蓝图类是代表玩家控制角色的蓝图,可以分析一下里面有什么。
Actor组件是必须存在于Actor内部的实体,可以将Actor的逻辑扩展到几个不同的Actor组件中。在这个蓝图中,可以看到4个可视化的Actor组件:
- 骨骼网格体组件:显示UE5人体模型;
- CameraBoom组件:显示玩家的摄像机视角;
- 箭头组件:可以让开发者看到角色面对的方向,不是在游戏运行时;
- 胶囊体组件:指定该角色的碰撞范围;
还有其他看不见的组件,它们由C++或蓝图代码组成。
再看看它的”事件图表“,发现什么也没有,这是因为相关逻辑已经在C++中写了。
网格体和材质
网格体
网格体就是3D模型,可以通过网格体组件添加网格体,这些网格体继承自Actor组建类。其中最重要的网格体组件有两类:
- 静态网格体:适用于没有动画的网格体,如立方体等;
- 骨骼网格体:适用于具有动画的网格体,例如播放运动动画的人;
材质
材质可以指定网格体的表示方式,例如颜色、纹理,甚至操作顶点等。
设置材质
接下来给Actor设置材质,步骤如下:
在关卡编辑器的视口中选择一个蓝色立方体对象,在细节面板处可以看到它的材质信息:
点击材质-元素0右侧的文件夹图标,这将打开内容浏览器中该材质所在的位置。
双击这个材质资产,进入材质编辑器,然后在右侧细节中找到它的父项
M_Solid
,再进入材质编辑器:
材质编辑器
材质编辑器的界面如上图,主要有如下部分:
- 图表:和蓝图编辑器的事件图表类似,材质编辑器的图标也是基于节点的,但没有执行引脚。
- 控制板:在右侧,可以在其中搜索并添加相关节点到图表中。
- 视口:在左上角,可以预览材质的结果,并选择不同的图元。
- 细节:在左下角,该面板展示图表窗口中选择的材质资产或当前节点的详细信息。
- 工具栏:在编辑器顶部边栏,可以做一些操作。
可以按住数字键,然后在图表空白处按下鼠标左键以快速创建n维向量,最低1维,最高4维。
接下来看看M_Solid
节点的一些输入参数:
基础颜色:简单的材质颜色,通常与常量(使用Base Color节点)或纹理样本(使用Texture Sample节点)连接,让材质拥有特定的颜色或映射特定的纹理。
Roughness:材质的粗糙度,决定物体反射光线的散射程度。
Metallic:材质的金属度,决定物体看起来像金属表面的程度。
高光度:决定物体反射光的程度。
参考资料
- 《UE5游戏开发完全学习教程-C++篇》