蓝图入门

虚幻引擎入门

蓝图简介

蓝图是一个可视化脚本系统,是一种模块化的编程方式。如果你了解代码的话,甚至可以把蓝图里的任何东西对应到代码上,变量、对象、函数等等,编写蓝图也可以理解为编写代码的可视化操作。

蓝图类、实例化对象、蓝图脚本和蓝图属性

  1. 蓝图类

​ 蓝图类是包含了一个实例对象的各种属性和运动逻辑的容器,命名常用大写BP_开头,也就是BluePrint蓝图的首字母缩写。

img

  1. 实例化对象

​ 通过编写在类中的属性和逻辑创建出来的一个具体事物,我们拖拽到世界场景中的物体都是实例化对象。

创建实例化对象就是将包含属性和功能的蓝图类拖拽到世界场景中即可,如上图的人物。

  1. 蓝图脚本

​ 编写在事件图表中的具体逻辑。

img

  1. 蓝图的属性和功能

​ 各种各样的变量以及装载在蓝图中的组件来实现的,蓝图是一个包含属性和功能的容器。

img

双击组件可以查看具体的属性,通过编辑属性达到我们想要的结果。

蓝图总览

CTRL + B打开资源管理器——》双击进入蓝图类(一般BP_开头)

进入蓝图类概览图如下:

img

  • 蓝色区域为蓝图类的一些全局操作菜单,比如文件保存、编译、模拟、进入世界查看等等。
  • 黄色部分为组件,蓝图资产就是有这些组件组成,双击组件可以查看组件细节,也就是右边细节编辑器,里面包含了各种各样的属性,比如变换(位置、缩放、角度)、动画、网格体、物理模型、碰撞、光照、纹理、光线追踪等等,细节很多,但作为初学者了解一些常用修改即可,细节决定了最终的效果展现。
  • 中间绿色区域为一些具体的蓝图编辑窗口,上图中的视口可以看到资产在空间中的位置,也可以对其进行变换、其次是事件图表,这绝对是蓝图中绕不开的点,是很多事件逻辑的展现,涉及组件、变量、函数等一系列操作,通过双击左侧我的蓝图中的事件图表可以进行定位。通俗来讲,通过编辑组件和细节,可以决定资产在世界中的效果以及属性,而通过定义一些所需的变量和函数,配合蓝图自带的巨大的函数库,进行事件图表的编写,可以实现资产在世界地图中的一些操作逻辑、运动逻辑等等。虽然不一定正确,但新手可以这样理解,组件和细节决定我的资产长什么样,事件图表的逻辑决定了资产能干些什么。

变量和变量类型

变量

步骤:CTRL + B打开资源管理器——》双击进入蓝图文件(一般BP_开头)——》添加变量——》定义变量的名称和数据类型

  1. 变量添加(蓝图文件——》我的蓝图——》变量添加)

img

可以通过加号添加,也可以通过空白处鼠标右键唤起菜单栏,点击变量选项进行添加。

变量类型

img

基本数据类型:布尔、字节、整数、Interger64、浮点、命名、字符串、文本、向量、旋转体、变换等,每种变量都有对应的颜色,使用熟悉后就可以根据蓝图中节点颜色判断变量的类型。

类型取值
布尔1 | 0
字节0-255 不可以存放整数
int32-2147483647——2147483647
int64-9,223,372,036,854,775,807——9,223,372,036,854,775,807
浮点可存放6位小数
向量存放位置、旋转、缩放、力、向量等,内部实现为三个浮点数(可通过拆分向量拆分成三个方向的浮点数)
旋转由向量的定义可知,旋转也是一种向量
变换存放了三个向量、旋转、位置、缩放
字符串字符串与文本和命名差别不大。主要实现字符串之间一些操作、相加、打印等等
文本格式化字符串,常用作组合输入
命名一般用来给文件命名

蓝图中设置变量时,如果超出了变量范围会自动修正为最大值或者最小值,所以不用担心设置的值超出变量范围!!!

当然,也没有必要记,鼠标悬浮在节点上就会有对应的显示。

img

操作符

下面是列举的一些常用操作运算符以及一个最简单的示例流程。(添加运算符只需空白处右键搜索即可,对应的运算符有悬浮框注解可以查看,赶紧动起手来,打开项目去了解吧,图中的方框注释只需要我们右键框选组合按住C键即可),当然运算符也远不止这些,需要我们在实践中不断积累。

img

蓝图布局以及蓝图逻辑

遵循原则:从上到下、从左到右,能直线就直线,别弯折。

不得不说,有强迫症的人在这方面有优势,构建的蓝图更具易读性和美观性,当然如果你能理清楚你自己的蓝图逻辑且自己玩项目自娱自乐,想怎么连就怎么连,但如果涉及到合作,最好还是按规范来,提供团队效率。

规范布局示例:

img

不规范布局示例:

img

有夸张的成分在哈,破坏规整结构的时候真的很难受,不规范布局常常存在许多可避免的弯弯曲曲的线,并且出现线交叉、遮挡等情况,非常不好!!!

构建美观蓝图布局常用的三个快捷键:

1)鼠标右键框选 + 键盘C键

2)按住键盘S键 + 鼠标左键

3)注释换行: Shift + Enter

引脚操作

img

1)断开节点连接:该节点前后所有连接先都断开,也就是将该节点独立出来了。

img

img

2)复制、拷贝、删除、剪切点击节点后使用熟悉的快捷键即可操作,也可以右键查看说明操作。

3)折叠到节点(可以理解为轻量宏)、折叠到函数、折叠到宏(框选的节点生成宏,可以理解为节点组合块)

4)对齐操作,熟练后你也可以直接使用图中的快捷键进行操作

img

流程控制节点

事件图表空白处鼠标右键搜索流程控制快速查看:

img

各节点信息如下:

img

每个分支的作用:

分支:根据boolean值执行对应的后续操作

Flip Flop:A和B之间进行轮替,从A开始

序列:顺序执行多个序列,如果默认两个序列不够用,可以通过添加引脚添加所需要数量个序列

For Loop:根据索引执行LoopBody,也就是循环体

For Loop with Break:也是根据索引执行,但执行进入中断,后面将不再执行

While Loop:只要条件一直为true,就循环执行

Do N:只执行N次

Do Once:只执行一次

DoOnce MultiInput:多种触发条件、查用互斥原则,每次只会触发其中一个条件,直至重置

Gate:控制一条路径的开启与关闭,Toggle转换开关状态

MultiGate(不常用):根据参数决定是否顺序执行多条分支,还可以执行一个回合后自动阻断,直至重置

节点输入端接受变量来控制流程的运行逻辑,也就是说分支前的变量值决定了后续的执行线路。

Actor类内节点

所有可以放入关卡的对象都是Actor,比如摄影机、静态网格体、玩家起始位置。Actor支持三维变换,平移、旋转、缩放,可以通过下列节点获取Actor的一些基本信息。

获取Actor信息的节点:

img

变换类别中的set和add函数

通过如何搜索可以快速查看所有的set和add操作,如果使用英文版,替换为对应的关键字搜索即可。

img

img

img

设置Actor相关节点信息如下:

img

添加Actor相关节点信息如下:

img

资产

下图中为UE项目文件夹中的部分文件:umap为主资产、uasset为普通资产。其中umap文件在蓝图中常被称为关卡,包括创建的蓝图类在内,都可以被引擎识别为资产,资产被引用的时候,引擎就会将相应路径的资产加载到内存中。

img

结构体资产:

CTRL+Space打开资产——》右键空白处——》创建高级资产——》蓝图——》结构体

img

img

双击进入结构体进行编辑,编辑完后一定要保存,一定要保存!!!

img

保存的游戏:是否进行序列化,序列化就是允许将该变量从复杂的数据结构转换为便于存储的简单数据,一般不进行勾选。

当我们创建完结构体变量后,可以点击结构体旁边的标签进行默认值的设置。

img

可以设置单个数值、数组、集合、映射,如上图所示,设置完成后一定要记得保存呦~

结构体函数

上面我们创建了自己的结构体,里面定义了一些变量并且进行了初始化,下面看看相关的结构体函数节点信息。

img

碰撞检测

了解阻挡、重叠、忽略相关观念,通过相应的碰撞函数实现碰撞的交互模式以及实现效果。

三种碰撞检测方式:

1)碰撞通道检测——》蓝图中以 by channel 为后缀的检测节点

img

2)描述文件检测——》蓝图中以 by profile 为后缀的检测节点

img

3)Object类型检测——》蓝图中以 for object 为后缀的检测节点

img

碰撞事件的绑定和解除:

img

获取边界:

img

球体重叠和盒体重叠:

img

常用快捷键

快捷键效果
鼠标右键 + Q / E世界场景 上 | 下 移动
鼠标右键 + WSAD世界场景 前 | 后 | 左 | 右 移动
蓝图类编辑面板按住鼠标右键(蓝图中)移动视图
CTRL + Space空格开启/关闭资源面板
CTRL + W关闭打开的蓝图类窗口
框选蓝图节点 Shift + W / S(蓝图中)选中的蓝图节点 上对齐 / 左对齐
鼠标右键选中节点 + C键(蓝图中)给组合节点添加注释信息
G键世界场景是否显示坐标轴信息,按G键切换
变量拖动到蓝图中(蓝图中)获取变量 / 设置变量值
Alt + 鼠标左键点击引脚(蓝图中)断开引脚
双击连线(蓝图中)创建中间点,作用为了使连线更美观清晰
选中物体 按住Alt + 移动复制并移动物体
选中一个物体 CTRL + E进入蓝图类、进行编辑
G + 左键(蓝图中)快速创建 Gate 节点
F + 左键(蓝图中)快速创建 ForEachLoop 节点
O + 左键(蓝图中)快速创建 DoOnce 节点
N + 左键(蓝图中)快速创建 Do N 节点
B + 左键(蓝图中)快速创建 分支 节点
S + 左键(蓝图中)快速创建 序列 节点

实战案例——板子弹球

案例中使用到的蓝图节点:获取actor位置、限制、添加actor移动、获取基于法线的反射向量

构建思想:面对对象编写蓝图。

1)Actor种类:决定了蓝图类的个数

2)Actor属性:决定了蓝图类中变量的个数

3)Actor行为:决定了每个蓝图类中函数的个数

4)行为触发条件:决定了蓝图节点间的连线方式

1)Actor种类,共有墙面、小球、反弹板和操作板四个对象,可操纵的蓝图也就是操作板是pawn,因此我们需要创建三个actor和一个pawn。

img

准备工作:新建一个空白关卡,创建三个actor和一个pawn

img

2)Actor属性:变量范围很广,包含组件、资产以及各种传统的变量。

Wall:墙用来控制关卡边界和范围,用一个模型作为变量即可

Ball:小球有速度、运动方向、模型三个变量

Defender、OperableActor:跟小球一样,有速度、运动方向、模型三个变量

img

img

墙和小球的属性设置完毕,操作板和反弹板安装小球一样设置即可,记得编辑完后一定要保存!!!

3)Actor行为:

反弹板——》跟踪反射小球的运动

小球——》运动和反弹两种行为

操控版——》根据映射操控左右移动的行为

  1. 将三个组件设为跟组件,并且由于 新建关卡没有光照,放置一个sky light天光,并且构建墙体。

img

img

img

球和墙体的构建,这里简单构建了下

img

  1. 让小球运动起来,碰撞反弹

接下来想办法让小球移动起来,通过添加Actor世界偏移来实现,进入小球的蓝图:

img

img

分割结构体后,使变量操作维度更小,信息更完整

img

小球运动规则:如果发生碰撞,则会根据碰撞表面法线算出反射角、重新设置运动向量的方向,从而实现小球反弹的效果。流程如下:

img

将函数连接到事件图表事件Tick上,事件Tick就是程序运行中每一帧刷新一次,如下:

img

这里一定要注意你的小球是放置在平面上的,在操作过程中如果没注意,比如小球有一部分陷入到地面中,小球是不会自己移动的。下面是小球移动的一个瞬间的截图,现在的效果是小球在这个空间移动,一旦碰撞到东西就会反弹移动。

img

  1. 构建反弹板,让反弹板获取小球的方向坐标,也是使用添加Actor世界偏移来实现,通过获取自身和小球指定方向上(x轴或者y轴,具体看你世界场景的搭建)的差量来判断运动方向,再通过clamp来限制运动速度,最终实现追踪球的操作。

img

img

上述蓝图编写完后,发现反弹板并没有根据小球的Y轴位置,自发移动,回到关卡场景中,又发现了和上面相同的问题,我们的反弹版Defender有一部分在地面下方,会不会因此导致无法移动呢?如下图:

img

要想让一个物体紧贴地面,只需要将物体移到指定位置上空,确保下方没有障碍物的前提下,按End键让其自由落下即可。

img

修改测试后还是没有移动,后来又把Defender蓝图编写检查了个遍,发现反弹板的Follow函数获取Actor世界偏移的Sweep属性没有勾上

img

Sweep值解释如下:

img

对上图中的限制做一个解释,这里是限制(浮点),还有一个限制(整数),作用就是返回A/B之间的值。

  1. 构造可操作弹板

项目设置中创建一组轴映射,这里设置A键和D键用来控制左右移动

img

在事件图表中对轴映射执行相应的操作

img

设置camera观察游戏视角、添加玩家控制

img

最后根据效果,由于设置为1移动过慢,可以通过乘操作符与速度进行运算后赋值,调整可操作控制板的移动距离即可。

img

结果图

半成品效果图:

img

游戏视角效果图:

img

游戏内效果图:

img

总结

只有跟着文档走完整个流程,相信你一定会有很多收获,包括但不限于UE界面的一些基本操作、快捷键、蓝图的一些基本概念、常用的节点信息、蓝图编写规范等等,这个过程对于刚入门的初学者来说一定是不容易的,需要消耗比较多的时间来尝试和熟悉,但只要你坚持下来,你是一定会有成就感的。不管你是热爱UE、VR,还是想为未来做铺垫,提高自己的能力,都需要你不断地取学习并实践。跟着我们一起学习UE、学习VR吧!!!