一.蓝图基础知识
虚幻引擎中的 蓝图 - 可视化脚本系统 是一个完整的游戏脚本系统, 其理念是,在虚幻编辑器中,使用基于节点的界面创建游戏可玩性元素。 和其他一些常见的脚本语言一样,蓝图的用法也是通过定义在引擎中的面向对象的类或者对象。 在使用虚幻 4 的过程中,常常会遇到在蓝图中定义的对象,并且这类对象常常也会被直接称为“蓝图(Blueprint)”。
该系统非常灵活且非常强大,因为它为设计人员提供了一般仅供程序员使用的所有概念及工具。 另外,在虚幻引擎的 C++ 实现上也为程序员提供用于蓝图功能的语法标记, 通过这些标记,程序员能够很方便的创建一个基础系统,并交给策划进一步在蓝图中对这样的系统进行扩展。
1.关卡蓝图和类蓝图的区别
a.在虚幻编辑器中位置的区别
关卡蓝图:
类蓝图:
通过上面打开蓝图编辑器可知,关卡蓝图没有和类蓝图一样的视图窗口。
b.从作用范围上区分
关卡蓝图中的逻辑是作用于整个关卡的,而类蓝图的逻辑只做作用于类本身,不会控制关卡的逻辑。
2.类蓝图和对象实例
对于类蓝图来说,当我们创建好类蓝图后,并在类蓝图中编辑了这个类的相关逻辑,此时我们只是完成了对于这个类蓝图的定义,真正的实例化是将类蓝图拖到我们的关卡场景中,此时在关卡场景中的物体才是类蓝图的实例化。
3.蓝图节点
a.什么是蓝图节点
b.蓝图节点的分类
事件节点:
开始事件和事件结束节点:当类蓝图被实例化的时候会触发的事件和类蓝图被销毁的时候触发的事件节点。
事件Tick:
开始重叠和结束重叠事件(有碰撞的物体才可以触发是事件):
碰撞节点:
函数节点:
自定义函数(制作虚幻引擎中没有的交互逻辑或者将复杂的交互逻辑编写成一个函数方便多次调用):
变量节点:
控制流和分支:
顺序:
选择:
循环:
4.面向对象的编程思想
没有使用面向对象的编程思想的工程:
面向过程的语言和面向对象的语言:
面向过程编程的项目逻辑:
面向对象编程的项目逻辑:
封装:
继承: 子类会自动继承父类的函数和变量,同时子类也可以有不同于父类的函数和变量
虚幻引擎中创建子类的方法:
父类的更改会导致子类也更改:
多态:
5.类型转换节点:
在设置好重叠检测器后,当有物体同检测器重叠时,组件开始重叠时这个事件会捕捉同检测器发生重叠的Actor,此时类型转换为会检测此Actor是否是我们想要的Actor,转换成功后,我们就可以使用这个Actor中变量和方法。
蓝图是一种强类型的语言。
二.开关门交互实现
1.需要用到的模板和内容包
2.给门添加碰撞
进入第三人称模板场景,找到门的模型,并将门的模型添加到我们的场景中:
此时我们运行游戏,会发现我们的角色可以穿过我们门的模型,说明我们没有给门添加碰撞。
在调整大小时,我们会遇到一个问题,就是我们的模型大小无法调节的非常的精细,那么
在这里可以调整大小的改变强度。
此时我们对于门模型的碰撞就添加好了。
3.添加盒体触发器 
4.开关门互动实现
将我们与门互动的逻辑写在关卡蓝图中。
关卡蓝图一般是写下场景中的互动事件,会将这些逻辑写在关卡蓝图中。
a.将门模型改为可移动的
我们要想完成开关门事件,首先要保证门模型是可移动。
然后选中我们的合体触发器,然后在选择蓝图
为盒体触发器增加检测人物进入和人物出场景设置。
添加当我们的人物进入到盒子出发器时的事件和离开后出发的事件
上面是进入事件,下面是离开事件。
设置Actor旋转:当触发时,关卡蓝图中的所有模型都会发生旋转。
此时我们运行游戏,发现可以触发开门事件。
但是我们观察开门动作很僵硬,同时也没有办法完成关门动作,此时我们要设置事件轴。
然后在添加一个关键帧数值设置为2.00 85 然后调整长度为2.00,这个长度很重要因为他关系到我们完成整个开门时间和关门时间的长度。
但是此时我们运行游戏发现开关门动作还是不丝滑,所以此时我们需要更改时间轴的平滑程度。
将我们开门的动作变为由慢而快,使我们开门的动作不会那么生硬。
此时添加完事件轴并设置好运行轨道后 ,当面触发这个时间轴后在之后的设定的时间内,会不断的触发物体旋转的这个事件。
此时我们的开关门事件完成设置。
此时我们也只是完成了对于一个门的开关门事件,但是如果我们的场景中存在多个门,那么我们是不是要对每个门都进行上述添加蓝图的操作,这样岂不是有点太过于繁琐了。
5.将开关门事件的蓝图写在一个actor类里面
a.创建门的蓝图类
要想让门发生旋转,首先要保证门的中心点在左下脚,
调整方法:
在导入模型前就调整,在3d模型应用中调整(推荐)。
还有就是,创建一个空的组件,然后将我们的模型放到这个空的组件下,然后调整我们的模型,使此时组件的中心点处于我们想让模型的中心点的位置。
添加盒体触发器
要使得盒体碰撞和我们的门处于同级目录下,这样才会产生开门的效果。
设置场景旋转:旋转的角度是相对于世界坐标轴。
设置相对旋转:是旋转相对物体本身的角度。
设置Actor旋转:是管卡蓝图中的所有模型都进行旋转。
6.使用按键E/鼠标点击来实现开关门事件
想要通过键盘按键来实现开关门事件,首先要确保我们的人物在门的前面也就是当我们的人物进入到盒体触发器中,但是就像前面的方式一样,当我们的人物进入盒体触发器时门就会自动实现开关门事件,所以显然此时我们要对当我们的人物进入盒体出发器时加判断,也就是gate。
使用g + 鼠标左键可以快速呼出Gate
此时我们运行游戏,当人物进入到门前时,我们按e发现并不能触发开关门事件。那是因为此时我们并没有获取玩家的输入。
此时我们运行游戏,发现我们按e可触发开门事件,但是再次按e无法进行关门事件,此时我们观察我们的蓝图发现:
在这个地方并没有关门事件。但是此时我们只能连接一条线,此时就要用到FlipFlop。
FlipFlop执行第一次的时候走A,执行第二次的时候走B,执行第三次的时候走A,以此类推。
此时运行游戏即可完成,按下键盘e完成开关门事件。
鼠标点击完成开关门事件。
方法一:
方法二:
7.实现升降电梯
a.创建Actor类
b.添加组件
c.设置蓝图
这里会遇到一个问题:
当我们将我们制作好的电梯放入游戏场景中后,此时在游戏场景中改变电梯的大小而非在蓝图编辑器中更改大小,此时运行游戏,电梯的升降就会发生问题。
8.实现双开门交互

9.拾取钥匙开门
我们在经过上面的操作后当人物进入盒体触发器时,我们按下e或者点击鼠标都可以进行开关门事件的交互,那么此时我们想要在这个中间过程加一个钥匙来完成开关门事件,所以此时就需要在我们按下或者点击鼠标到与门开始发生交互前再加一个判断。
首先我们要在蓝图中添加一个变量用于表示我们是否可以开门:
按ctrl + 左键来将我们是否可以开门这个bool变量托入我们的蓝图场景中:
此时我们对于是否有钥匙的判断就完成了。
现在我们开始制作钥匙:
10.角色处于门的内外,门开门的方向不同
要完成这个交互事件,首先要进行的是当我们要执行开门的事件时,要判断的是我们的人物此时处于门的内部还外部。那么要判断人物是在门的内部还是外部,就需要一个根据玩家在门内还是门外的产生变化的值,通过这个值的变化来判断我们的人物此时是在门内还是门外。
三.实现人物在特定区域内的加速
1.蓝图通信
蓝图通信就是两个类或者多个类之间产生联系或者发生关系。
2.类型转换
首先当我们的人物进入和走出特定的区域时,很显然是会有触发重叠和取消重叠的判断的,所以在蓝图类中首先我们要添加开始重叠和取消重叠的事件。
然后当我们的人物进入特定区域时,触发的事件是我们的人物的最大移动速度变快,也就是对我们人物的属性进行改变,那么也就意味着我们要先将我们的类型转换为人物的类型,此时才可以对人物的属性进行更改。
类型转换的作用:
a.用于蓝图通信。
b.只有当前类型,进入到盒体检测碰撞的时候才会,触发改变,其他的不可以。唯一性。
3.自定义事件
创建自定义事件
四.通过键盘按键实现场景中的物体旋转
1.对象引用
a.可以使我们在蓝图图表中的连线更加有简洁
b.蓝图通信
创建对象引用的方法:
方法一:
方法二:
2.什么是有效性
在创建变量的引用后,要保证该变量的引用的有效性,使用is Valid来判断,如果不进行判断,在编译的时候会报错。
3.实现物体旋转
a.创建实现物体旋转的Actor类
b.选择是Actor类中的那个组件发生旋转
c.使物体的角度一直发生改变
每一帧都执行本地添加旋转的事件。
此时运行游戏,我们发现物体发生了旋转。
4.实现通过按键开启和关闭物体的旋转
a.创建分支来判断此时物体是否可以旋转
使用按键b加鼠标左键可以快速添加分支
给这个分支添加一个变量用于判断。当这个变量是true时会执行触发物体旋转,反之则不执行。
因为我们要实现的是通过按键来实现对于物体旋转的控制,所以要新建一个事件来控制物体是否可以旋转,也就是对变量是否可以旋转的默认值进行更改。
创建好后因为我们是要使我们的人物通过按键来实现对物体旋转的控制,所以我们要在人物中创建一个事件用来通过按键触发这个控制旋转的事件。
当我们设置好变量引用后,首先我们要对变量的有效性进行检查,这一步是必然的否则我们编译无法通过。
当我们设置好引用的有效性后,我们要控制的是,自传物体这个对象中的控制旋转。
5.当场景中有多个相同的Actor类的物体时,不通过公开的形式实现按键旋转
五.小型解密游戏的制作
1.新的蓝图节点
2.给Actor类添加文本提示
这个文本组件中不可以添加中文,如果输入中文会产生乱码。
添加过滤器,使得后面的逻辑操作只有是我指定类型的actor才可以执行
设置文本可视性
六.实现按shift加速和位移
七.通过按键实现上下车功能
预备工作:在我们的项目中要有第三人称和载具类游戏的功能包。
分析人物上下车的这个事件:
人物移动到车的附近,然后按下F上车开车,然后再次按下F人物下车。
通过分析可知,首先要做的是给汽车模型添加盒体检测器,用来判断人物是否在汽车的附近。
调整盒体检测器的大小。
在蓝图编辑器中添加盒体触发器的开始重叠事件和取消重叠事件。
因为检测的是人物是否在汽车的旁边,所以要将类型转换为人物的类型。
人物按下F键后要触发上车事件。
在汽车蓝图中创建自定义事件。
在人物蓝图中通过按键F来触发上车事件。
创建汽车的引用。
使用类型的引用前要先判断引用的有效性。
触发上车事件。
此时还不可以调用上车事件,因为此时汽车引用还是一个空的引用,所以当人物进入到盒体检测器中时,要给汽车的引用传值。
在汽车蓝图编辑器中。
此时要给引用赋值,要调用的是汽车本身,所以将汽车本身传递给人物蓝图中的汽车引用。
当人物走出盒体检测器的时候,要将这个引用的赋值取消。
调用上车事件,g + 鼠标左键,快速在场景中添加Gate。
将控制权变换到汽车上。
但是此时可以控制汽车,但是人物并不会跟着汽车一起移动,所以首先要将人物的位置变换到汽车上。
添加球体碰撞,用于人物获取上车时候的位置。
将变量的类型改变为pawn。
将上车事件上的人物类型改变为pawn。
在人物蓝图中将人物自身传给上车事件。
此时运行游戏会发现画面变得非常的奇怪,人物将车弹飞了,是因为没有关闭球形检测器的碰撞预设。
然后在运行游戏,发现人物和汽车疯狂的转圈,此时是因为人物的碰撞和汽车的碰撞直接导致的。此时要关闭人物的碰撞。
但是此时人物并不会跟着汽车的移动而移动。
此时需要将人物合并到球体检测器组件上。
人物下车。
此时人物和车是一体的所以,此时要实现通过按键F实现人物下车,触发键盘F的事件要添加在汽车的蓝图类中。
人物下车首先是要人物从球形检测器组件中拆分出来。
然后我们希望人物下车后的位置是在车门的附近,所以和固定上车位置一样,在通过球体检测器去固定一个下车的位置。
因为当汽车在移动的过程中,球形检测器的坐标系会跟着汽车的移动发生变化,但是人物在下车时,只希望人物的z轴随这汽车的改变而改变,所以在设置人物下车的位置时,只参考球形检测器的z轴的转向。
但是当人物下车后,发现汽车还是会向前移动。
八.实现子弹打靶的交互
九.实现枪的连发功能
十.设置游戏倒计时和游戏结束UI
十一.实现枪类
1.创建第一人称射击游戏项目
2.去除掉多余的组件
红圈中的内容都是不需要的
编译蓝图类,去除报错
3.创建函数
4.捡枪
5.丢枪
6.射击
十一.
十二.激光枪