The Basics Of Nodes In Unreal Engine 4/5
原作者:Matt Aspland 本文为英文视频教程整合的中文笔记,旨在快速了解蓝图常用的节点,为使用引擎打下坚实的基础
1. Flip Flop 触发器
【资料图】
打开关闭某种功能
切换状态。
通常用途:
角色切换冲刺或普通运动状态。
蹲下或站立状态
2. Lerp 插值
Lerp的全称是Linear Interpolation 线性插值
本质上根据alpha值设置或者更改值
应用范例:使用一个timeline来执行开门。
时间线的轨道将使用lerp的alpha值,并且得到一个打开和关闭的位置和角度。
然而当你想要打开它进入a和b之间的的角度,这意味着随着timeline的进度,它将使用alpha值来找到a和b之间的开关位置。轨迹是从0到1,当alpha值是的时候,门将是半开或半关。
3. Do Once
这个节点之后的所有代码只执行一次。
就算在Event Tick里它也只会执行一次所有的操作,直到你重置它。
比如鬼屋里只能打开一次的门,进屋后,门就一直关闭不能反复开关了。
这是一个可以反复开关的门
在出口添加Do Once节点,然后再播放动画,这样门只能打开一次。
可以使用Reset入口来控制它的重置。但是Reset不会重置动画。
4. Switch On Int 切换整型
根据某个数值触发一行代码
类似于其他语言的Switch...case语句
5. Sequence 序列
从一个事件触发多行代码
例如:从一个Event Tick来触发耐力系统,通过序列来获得多个执行的代码行(háng)。
它可以按序列同时执行,不用等第一个序列执行完再走到第二个序列。每个序列都是独立的代码行相互不干扰。
to 类型转换
主要应用于不同蓝图之间的调用,选择正确的对象并转换为相应的类,从而调用该对象中的属性。
角色蓝图 (Pawn也是类似的用法)
是从一个蓝图投射到另一个蓝图的实际应用方法。
关卡蓝图调用角色蓝图
分支
程序里的If....Else...
检查布尔变量的值,如果为真则触发真分支的代码如果为假则触发假分支的代码。
循环
在循环体中触发从第一个到最后一个索引之间的代码,然后触发代码的执行内容并无限期的重复这个操作,除非被告知仅执行一次,或一定的次数。如果想要停止的话可以用带Break的For循环
循环体是你希望在循环内执行的代码行,第一个和最后一个索引是你希望循环执行的次数。
Completed是你希望在循环结束后执行的代码行
9. Begin & End Overlap 开始/结束重叠
开始重叠和结束重叠 将沿着执行行触发一个脉冲,这对于打开特定区域的门很有用。
在一个门的前面但不是特别远的时候可以使用重叠事件。
TriggerBox的Overlapped Actor是你需要忽略的行动对象,比如你不希望AI角色进行操作,只希望自己操作的角色来触发重叠。就可以把AI角色放在这里。Other Actor是你可以用来进行重叠操作的行动对象。
10. Gate 门
门可以让你开关来控制执行流程。
想象一个真实世界开关门的流程,开->进入->走出->关
在开->关后是无法进入的
![[Pasted image ]]
进入门的碰撞领域 触发Open 然后按E 触发进入Enter,离开碰撞领域 触发Close。Exit可以触发开门的所有后续操作代码(Enter后)。
而Toggle锚点属于用同一个事件来控制开关。
N 执行N次
类似于Do Once ,但是可以指定执行次数。
图中展示一个最大行走速度逐渐增加的过程,在停止移动后重置。在开始行动后递增速度每次15,递增50次(除非中断行走)
12. Custom Event 自定义事件
在蓝图中可以自己创建的事件,触发或者调用代码比如一个宏或者一个函数。
一般代码的起始就是从一个事件触发,你需要从其他的东西触发它然后触发事件,从而运行后续的代码。
为什么不直接使用宏或者函数开始呢?因为事件可以不需要白色的执行线来引用,它可以被重复调用多次,这样不会造成代码的混乱。它的作用跟宏和函数是类似的,但是可以应用到更复杂和细节的代码中,把代码写入事件,再调用事件。
一个飞行机制模式切换的自定义事件,参数可以自定义
使用按键即可调用事件
在任何时间,任何地方都可以调用自定义事件,在关卡蓝图也可以调用角色蓝图的自定义事件。
13. Print String 打印字符串
用来测试和Debug,在打包好的游戏或导出的游戏是不适用的。只在引擎内部使用。
它会显示在视口的左上角。在实现UI界面之前,可以输出一些数据比如体力,生命值,来确认你的代码是否工作正常。
一个生命值递减的打印显示,在最后生命值小于0的时候打印出角色死亡
14. Variables 变量
Integer 整型
淡青绿色 完整的数字
Float 浮点型
草绿色 实数,双精度,如果需要更高精度的数字则需要用到
Text 文本
淡粉紫色 一般用来写在名称
String 字符串
玫红色 字符和数字的集合,用来表示句子
Vector 向量
淡金黄色 使用3个数字来表示3D坐标的位置。x y z
Rotator 旋转体
淡蓝紫色 也是使用3个数字来表示旋转位置 x y z
Transform 变换
橙色 可以用在旋转,位置,大小的变量上,三个值存在它一个上面
Object 对象
浅蓝色 对属性的引用,可以是光源,静态网格体或者声音盒子
15. Get All Actors Of Class 获取类的所有Actor
可以用这个节点来更新关卡中当前Actor的数量和类型,它可以放在GameMode里。每个target在创建或者销毁的时候都可以调用这个节点。
这是一个效率较低的节点,虽然它是一个获取对象的通配符,使用它的话会遍历当前关卡的所有Actor。 不仅仅是你想要转换的Actor。这样会导致代码变得缓慢。不要在每帧使用它,可以在事件开始运行(Event BeginPlay)或者自定义事件(Custom Event)使用它,触发一次。
但是不要太频繁的使用它。
它基本就是一个Cast to,但是它返回指定这个类别的任何蓝图Actor的数组。
另外还需要使用索引编号取出单个的Actor,获得一个副本,然后再访问它以下的内容。
如果不需要获得类中的所有Actor可以使用Cast To来代替,因为你可能也需要用到Event Tick来快速执行操作,每次获取类的所有Actor时,可能就不够快。
16. Blend Poses By Bool 按布尔混合姿势
动画蓝图中的节点
通过一个布尔值混合两个姿势。
范例:在状态机根据布尔值来确定不同状态下的姿势,枪械是否装备,条件为真使用带枪姿势,条件为假使用普通姿势。Blend Time代表姿势变换需要的过渡时间。
在动画蓝图的事件图表里设置好布尔值
在角色蓝图中的事件图表设置触发切换布尔值模式的代码
这是快速有效的设置多个动画的方法。可以只写一个状态机,但在不同的混合空间或者动画之间切换状态。
Dispatcher 事件分发器
范例:从玩家蓝图触发关卡蓝图中的事件,正常来讲 无法在玩家蓝图投射关卡蓝图。
在玩家蓝图中创建事件分发器。使用事件分发器来传递变量,这样可以根据等级的数值的变动来改变关卡蓝图。
使用Call来调用这个事件分发器,并把参数Level设定好传入。在调用的时候实际上是在整个游戏中将消息广播到侦听此事件的任何其他蓝图。
在关卡蓝图侦听事件并执行后续的代码。
在关卡蓝图投射玩家蓝图并绑定这个事件分发器,从Event事件创建一个新的自定义事件,这时候可以调用Level这个变量。
在自定义事件后使用变量作为触发条件来执行后续的代码。
事件分发器是一种很有效的调度方式,尤其是一次多个事件。因为在调度程序时它会同时触发所有绑定到它的事件。并且我们可以通过它传递变量。比如通常无法投射到的关卡蓝图。
蓝图接口只是做了一些与事件分发器略有不同的事情,它更多用于触发事件,而蓝图接口更纯粹地用于通信和触发函数,而不是事件。
Tick 事件Tick
事件Tick是个需要小心使用的事件,因为如果使用不正确它可能会导致游戏反应滞后。
它会在每个Tick的时间触发,一个Tick是一帧,如果每秒60帧的速度运行,那就会每秒运行60Tick次。
事件Tick会触发相当多的次数,它将归档每一帧,每秒144帧会使事件一秒触发144次。它的运行效能取决于你的电脑。如果用的太多或者使用错误,对电脑的性能要求可能会很高。
一个很好的替代方案是使用自定义事件,因为很多人使用事件Tick来查找值。
如果一个生命值低于一个确定的值,那么可以创建一个自定义事件,然后当收到伤害时再去检查生命值。这样就不需要一直检查它,而只是需要的时候再检查。
请确保正确使用Event Tick而不是过度的使用。
如果打印Delta Seconds会得到满屏的延迟秒数,大约在左右,这取决于PC效率,有些电脑有更好的帧效率那么这个数字就会小一些。Delta Seconds是每次调用事件的间隔时间。如果想做一些依赖于帧速率的事情,无论有多少帧,这都是很好的选择,这段代码始终与系统的帧同步,并且结果始终相同。高FPS的话会有低Delta Seconds,低FPS会有高Delta Seconds。
代码将根据帧速率在上下文中运行。你可以在这个事件写任何东西,它只是一直在触发。
如果使用它查看生命值,之前说的是可以在自定义事件中实现,按需启动。
但还是可以利用它进行移动输入,然后使用Delta Seconds作为比例值,这样无论帧率是多少,最终得到相同的移动结果。
在转向的时候获取Delta Seconds 这样可以确保帧速率与相机的转向速率的同步。
Event Tick无法同时关联两个Branch分支节点,我们使用序列Sequence来连接后续的代码。
这样可以同时触发多个代码。
限制
夹子:它限制另外两个值之间的值。防止它高于或者低于某些值。如果需要精确的数字并且不需要手动设置。比如检查生命值是否超过100,如果超过了就将其重置回100,它可以自动执行这样的操作。
Clamp节点将确保Health在最小值和最大值的区间内输出。
同理关于整数,向量,角度等等都是同样的方式。