快捷键:虚幻引擎蓝图编辑器速查表

许多蓝图相关的函数带有 Kismet/K2 等字样,这都是遗留的东西,Kismet 是虚幻引擎早期版本中使用的一种脚本系统

1 事件

特点:支持“委托”,支持时间轴

委托Delegate

事件右上角有一个红色小正方形的事件称为委托。这只是对事件的引用。某些操作接收事件作为参数,并使用委托来实现事件。
在下图中,名为”时钟”(Clock)的自定义事件委托连线到”按事件设置定时器”(Set Timer by Event)节点的“事件”(Event)输入引脚,这样每一秒都会调用“时钟”(Clock)事件。
Pasted image 20230115232942

Actor 事件

Event Begin Play

游戏开始时将在所有 Actor 上触发此事件。游戏开始后生成的所有 Actor 上均会立即调用此事件。

Event End Play

Actor 从关卡中删除或移除时执行此事件。
Pasted image 20230824171438
Event Destroyed 函数的功能已合并到 EndPlay 函数。

Event Tick

游戏进程中每帧调用的简单事件。

Event OnReset

此蓝图事件节点仅在关卡蓝图中可用。
此蓝图事件节点仅在服务器上执行。在单人游戏中,本地客户端即视为服务器。

OnReset 事件在关卡重启时发出执行信号。 它在关卡重新加载后进行某项触发时非常实用。 如玩家角色已死亡,但关卡无需重新加载时。
Pasted image 20230113203029

Event Actor Begin Overlap

Pasted image 20230113203118
多项条件同时满足时,将执行该事件:

  • Actor 之间的碰撞响应必须允许重叠。
  • 执行事件的两个 Actor 的 Generate Overlap Events 均设为 true。

Event Hit

Pasted image 20230113203310
只要其中一个相关 Actor 的碰撞设置中 Simulation Generates Hit Events 设为 true,该事件便会执行。

Cursor

Pasted image 20230824193329|450
在关卡蓝图中设置如下:
Pasted image 20230824193402|550

ViewTarget

Pasted image 20230824193021|500
使用控制台命令
ViewActor actor_name 测试

Damage

Pasted image 20230824194042

对应触发蓝图:
Pasted image 20230824194017

Character 事件

跳跃发射落地下蹲

首先要保证 Movement 组件中勾选对应选项
Pasted image 20230824195739|500

使用蓝色函数触发事件
Pasted image 20230824195627|500
Pasted image 20230824200322

移动模式改变

Pasted image 20230824200613Pasted image 20230824200448|450

Possess

Possess 触发时执行事件,用于切换控制角色
Pasted image 20230824201029|301Pasted image 20230824201012|500

服务端事件

2 变量

变量公开为可编辑实例: 这样在面板上可以看到该变量
Pasted image 20221212143830

Pasted image 20221212143853
Tooltip: 设置鼠标悬停时的提示信息

修改变量信息: 搜索set
Pasted image 20221212144027|300

蓝图类通过按键操控需要修改input: 设置为Player0
Pasted image 20221212144352

右键分离引脚:
Pasted image 20221212150227
Pasted image 20221212150237

合并向量: Make Vector
Pasted image 20221212151309

Name

Name 类型适合作为变量名,不区分大小写。

我们可以使用该节点创建一个 Name 变量,而不需要按加号创建
Pasted image 20230824160051

Text

Pasted image 20230824160219
Pasted image 20230824160349

文本格式化 Format Text
Pasted image 20230115221522
{}表示一个输入值,可以设置多个,变量类型也可以是其他类型。
如果把 Text 设置成“默认值”,则输出如下:
Pasted image 20230115221625

合并文本: Append
Pasted image 20221212151559
文本内容判断: 相同返回 1
Pasted image 20221212151802

string

String 类型细节面板可以勾选 multi line,值可设定为多行(alt+enter 换行)

String 的操作

与 Text 类似,Trim Trailing 是删除尾部空白字符,Trim 是删除前面的空白字符,ToUpper 变大写,ToLower 变小写。

c4c32d055cc21f5f2f4d9485c965c7ff_MD5

Time Second to String 是把时间变成 String,Get Time Second 起到了计数的作用,将时间传递给 Time Second to String。Event Tick 需要连接到 Print String 上,做到高频率输出。

aed7b9d0649d2d95eab4053d9bdfcf64_MD5

其他: Right Pad,在源字符串后面加字节。

34e3ee2dc89b42e516d6f354d5891a04_MD5

Right Chop 就是从第几个字符开始保留。Right,保留后 5 个字符串。
Reverse,反向排列。

6e5ccc1c232efcdd04dc299e9d9c0df9_MD5

Replace 和 Replace inline 没什么区别。都是把一个字符串中,某一个字符修改为另一个值。

String 的拆分

2f573529c2bfc143d25f9cd393ae40f5_MD5

Parse Into Array:分割字符串。以某个分隔符将字符串切割为多个数组。

与之相对应的是 Join String Array,把多个数组以 Separator 为分隔符,压缩成一个字符串。

70c55b8c1a367023f5ba3f7649a4aca6_MD5

人宅老师课上说:这两对儿对于服务器和客户端之间的通信比较有用,是打包和解包过程中的一部分。

e2c5659dbebb25abd2c7b534d96db746_MD5

Mid 比较好理解,就是从第 i 个字符开始,截取 j 个字符,意味着字符从 i 到 i+j 被输出。这个与 Get Substring 一模一样。

cef3fcad07bb6d41530905e9eb100c9a_MD5

d363491c959534dcf4cf7c1c78efd25b_MD5

Matches Wildcard:查看该 string 里有没有通配符(* 和?)如果有,则返回 true。
Is Numeric:看字符串是不是只有数字
Get Character as Number:把字符串转为 ASCII 码。

098ccb29c5724c522104fde0d64c663d_MD5

Get Character Array from String:把 String 里的字符串一个一个打印出来。比如输入 abcdegf,输出就是 a b c d e f g。这里要用循环一个一个打出来。

Find Substring:找子串。返回找到子串的首元素位置索引。

5c2167885d219df66bec46b5ca91043a_MD5

Contains: 查找是否有子串。
Append: 合成两个 String

3 控制流

Pasted image 20221212152327

Switch

Pasted image 20230112115121
根据print函数传入的index,如果为0则打印0,如果为0则打印1,如果不是0或1则打印error

Select

Pasted image 20230112115354
根据print函数传入的index,如果为0则打印0,如果为0则打印1

实现和上文Switch相同的功能:
Pasted image 20230112115646

Branch

快捷键:B
分支:如果输入为true,则从true输出;如果输入为flase,则从flase输出
Pasted image 20221212152757

Do Once/Do N

Pasted image 20221212165749
执行一次/N次
执行次数到达上限时不可继续执行,可以通过Reset重制次数

Flip Flop

Pasted image 20221212170353
交替执行

Gate

单门:
Pasted image 20221212171213
Enter:执行Exit时间
open:开启Enter
close:关闭Enter
Toggle(开关):可以在open和close之间切换

多门:
Pasted image 20221212171717
按1可以顺序输出out0和out1,顺序执行后结束
Is Random,随机输出
Loop,循环输出

Loop

While Loop

while循环
Pasted image 20230112121045

For Loop

for循环
Pasted image 20230112121639

For Loop with Break

多一个break条件,跳出循环
Pasted image 20230112121904

Sequnce

序列:顺序执行所有节点
Pasted image 20221212172305

Delay

延迟后执行,Duration单位为秒
Pasted image 20221212172034
可触发延迟在持续点击时,会不断刷新持续时间,直到最后一次点击才进行输出。

Timer定时器

Pasted image 20230116005635
定时器(Timer)负责在经过指定时间后执行指定函数(或自定义事件)。

按事件设置定时器(Set Timer by Event):以自定义事件引用作为输入参数。
按函数名称设置定时器(Set Timer by Function
Name):以函数名称和包含该函数的Object作为输入参数。

Set Timer for Next Tick by Event:下一帧执行Event
Set Timer for Next Tick by Function Name:下一帧执行函数

两个函数都有以下参数:
时间(Time):表示Timer的时长,以秒为单位。
循环(Looping):指示Timer是继续执行还是仅执行一次。

获取控制权

Get Player Controller 获取Player控制权
Enable Input 开启输入
Diable Input 关闭输入
Pasted image 20221212230036

Delay

Pasted image 20230112131233
Delay:如果在Duration时间内,Completed指向的事件再次被调用,不会立即执行,等duration结束方可执行。
Retriggerable Delay:如果在Duration时间内,Completed指向的事件再次被调用,会刷新duration时间,即连续调用会一直处于delay状态。

逻辑运算符

  • and boolean(与)
  • or boolean(或)
  • not boolean(非)

4 空间位置变换

获取旋转平移缩放:
默认 rotation 为欧拉角
Pasted image 20221212182725
设置位置:
Pasted image 20221212183131
Sweep(扫描):移动时发生碰撞就会停止,如果关闭碰撞则穿透物体
Sweep Hit result:输出每一步的信息
Pasted image 20221212183622

移动:
Pasted image 20221212190836
局部坐标和世界坐标:
Pasted image 20221212184820
相对坐标:
Pasted image 20221212190605
相对父节点,比如类蓝图中:
Pasted image 20221212190646
Cube和Sphere的父节点都是DefaultSceneRoot
图中移动Cube,但是Sphere不会移动

在关卡蓝图中设置偏移量:
Pasted image 20221212194603

6 射线追踪Trace

提供两个端点(一个开始位置和一个结束位置),物理系统将”追踪”两个点之间的线段,报告它命中的任何Actor(带碰撞)

按频道或对象类型追踪

因为追踪使用物理系统,你可以定义需要进行追踪的对象类别。可在两个大类中进行选择:通道Channels和对象类型Object Type。
通道可以是可视性(Visibility)和摄像机(Camera)等事物,且几乎只和追踪相关。
对象类型是场景中带碰撞的Actor物理类型,如Pawn、载具、可破坏物Actor等等。

可根据需要添加更多频道和对象类型。有关具体操作的更多信息,请参阅 为项目添加自定义物体类型

返回单个或多个命中

追踪时,你可以选择返回与条件匹配且被追踪命中的第一个项,也可返回与条件匹配且被追踪命中的所有项。

需要特别注意 按频道多重追踪(Multi Trace by Channel) 和 按对象多重追踪(Multi Trace For Objects) 的区别。
使用 按频道多重追踪(Muli Trace by Channel) 时,追踪将返回包含路径上所有 重叠(Overlaps)和第一个 阻挡(Block),发生hit事件后就会结束追踪 。想象射击的子弹穿过高高的草丛,然后击中墙壁。

按对象多重追踪(Multi Trace For Objects) 将返回与追踪查找的对象类型匹配的所有对象,不会在其命中的首个物体上停止,假定组件设置为返回追踪查询。因此它很适合于计算追踪开始和结束之间的对象数量。
Pasted image 20230115175124

使用形状追踪

Pasted image 20230115180252
Pasted image 20230115180250

返回列表:
Pasted image 20230908132737|184
Impact Point 和 HitLocation 的区别:
Pasted image 20230908132847
HitLocation 是形状的中心,而 ImpactPoint 是实际与其他物体接触的点。
应用:剑刃长方形box的 impact point 位置确定
Pasted image 20230908133053

DrawDebugType

Trace节点有DrawDebugType选项,用于绘制测试追踪时有用的线条。绘制调试类型(Draw Debug Type)参数可以设置为以下某个值:
无(None):不绘制线条。
持续一帧(For One Frame):线条仅出现一帧。
持续时间(For Duration):线条在“绘制时间”(DrawTime)参数中指定的时间保持出现。
持久(Persistent):线条不消失。
要显示追踪颜色( Trace Color) 、追踪命中颜色( TraceHit Color)和绘制时间(Draw Time)参数,单击函数底部的小箭头。

从追踪获取UV坐标

Find Collision UV节点
Pasted image 20230115180729
如果使用Trace Complex,追踪可以返回它命中的Actor的UV坐标。
Pasted image 20230115181915|300
从4.14版起,此功能仅在 静态网格体组件程序式网格体组件 和 BSP 上有效。它 无法 在 骨架网格体组件 上正常工作,因为你追踪的是 物理资源,而物理资源不具备UV坐标(即使你选择Trace Complex)。

使用此功能将增大CPU内存使用率,因为虚幻引擎需要在主内存中保留顶点位置和UV坐标的额外副本。

在 项目设置(Project Settings) 的 “物理(Physics)”部分 中启用 支持来自命中结果的UV(Support UV From Hit Results) 功能,启用后需要重启。
Pasted image 20230115180611

7 容器:数组/集合/映射

数组Array

创建数组
Pasted image 20221212201825
设置初始值
Pasted image 20221212202237

Add(添加)
ADD Unique(增加不存在的数组值)
Clear(清除)
Contains (包含)
Filter Array (过滤数组)
Find ltem(查找)
Get(获取)
lnsert ltem(插入项目)
Last Index(最后一个索引值)
Length (长度)
Remove lndex(删除索引)
Remove ltem(删除项目)
Resize(调整大小)
Set Array Elem(设置数组元素)
Set Array Elem中的Size to Fit:当index大于数组最大索引,则扩充至对应数目并赋值
Shuffle (打乱数组,洗牌)

for each loop
遍历数组
Pasted image 20221212204732
for each loop with break
遍历数组 ,多一个break条件
Pasted image 20221212205241
Append 追加数组
将第二个数组追加到第一个数组,第二个数组不会发生变化
Pasted image 20221212212104

Filter Array(过滤数组) 节点取入一个类型为Actor(或其任何子项)的数组,并基于输入的Class(类)过滤该数组。所得结果是一个新数组,仅包含原始数组中和相连的类的类型相匹配的项目。
Pasted image 20230115214811
Find Item(查找项目) 节点取入一个数组和一个变量,然后查找在数组中第一次找到那个变量的值时该值所处的索引编号。
Pasted image 20230115214822

集合Set

Pasted image 20230115215753

  • 元素不允许重复
  • 无序

Add
将一个项目添加到Set。

Add ltems
从特定Array添加项目到Set。

Clear
清除Set 中的所有项目。

Contains ltem
检查Set是否包含某个项目。

Difference
获取两个Set的相对差,将差指定到一个结果Set。

lntersection
获取两个Set的交集,将差指定到一个结果Set。

Length
获取Set 中的项目数量(长度)。

Remove
从Set中移除一个项目。

Remove ltems
从Set中移除Array 中的指定项目。

To Array
将Set复制到Array中。

Union
执行两个Set的合并,将合并指定到一个结果Set。

映射Map

Pasted image 20230115214310
也可称为 关联数组 或者 字典

  • 存储键值对(Key-Value)
  • Key不能重复
  • 无序

Add
将一个键值对添加到Map。

Clear
清除Map的所有条目。

Contains
此节点检查是否提供的Map中有键存在。

Find
找到与提供的键相关联的值。

Keys
输出Map 中所有键的阵列。

Length
决定提供的Map中的条目数量。

Remove
从Map移除一个键值对。

Values
输出Map 中所有值的阵列。

8 结构体

Pasted image 20221212205745|200
创建结构体
Pasted image 20221212205836|400
Pasted image 20221212210138

break 分解
Pasted image 20221212210712|300
Set members 设置成员变量,引脚默认隐藏,可以设置开启
Pasted image 20221212210859|300
或者使用Set》Make方法:
Pasted image 20221212210916|300

结构体数组

结构体本身可以设置为结构体数组
Pasted image 20221212211335
结构体也可也添加数组变量
Pasted image 20221212211141

操作和普通数组类似,注意把引脚拆开
Pasted image 20221212211620|300

9 继承/多态

子类中显示继承的变量:
Pasted image 20230110114103
多态:子类重写父类的函数override
Pasted image 20230110110912|300
Pasted image 20230110113509

手动调用父类的函数:
Pasted image 20230111173106

创建子类

右键创建蓝图类:
Pasted image 20221212213216
点开子类,可以看到继承的部分
Pasted image 20221212213400

11 函数

数学函数

Lerp:插值

Interp To :插值到
Pasted image 20230115235150
lnterp To函数用于平滑地更改值,直到达到指定目标值。一些示例包括用于浮点值的FInterp To函数、用于矢量的VInterp To和用于旋转体的RInterp To函数。
输入
当前(Current) :当前值。
目标(Target):要达到的目标值。
时间差量( Delta Time):自上一次执行以来经过的时间间隔。
插值速度(Interp Speed):插值速度。输出
返回值(Return Value):更接近于目标值的新值。

纯函数

Pasted image 20230113204836
纯函数不修改状态或类的成员
如果执行顺序不重要且只是获得数值而不改变数值,那么就可以被标记为纯函数,不用关注什么时候执行(体现为不需要连接执行顺序白线),纯函数只能调用纯函数。

函数代码一致的情况下,两种节点可以看出不同:
纯函数
Pasted image 20230109175833
非纯函数
Pasted image 20230109175817

创建新函数,命名为PrintFunction
编辑函数:
Pasted image 20221212220454
在蓝图中使用:
Pasted image 20221212220531

函数局部变量

新建一个函数,双击函数既可以在Local variables中添加局部变量,局部变量尽在函数内部可见
Pasted image 20230115220637|300

12 蓝图通信

通信类型

Pasted image 20221212230239

关卡蓝图或蓝图类各自在蓝图之内的信息交互

Custom Event 自定义事件
Pasted image 20221212230914

关卡蓝图和蓝图类与场景内部的对象的通信

关卡蓝图

选中场景内的对象在蓝图中引用,通过get等获取数据

蓝图类

数据类型Static Mesh Actor,这里选择Object Reference
对象引用:引用场景中的实例对象
类引用:引用不在场景中的蓝图类
Pasted image 20221212231417
在Viewport中拾取目标Actor
Pasted image 20221212231841
这样就可以使用该变量表示拾取的Actor

动态Actor:
Pasted image 20221212232117

蓝图类之间的信息交互

创建两个蓝图类
Pasted image 20221212233610
Pasted image 20221212233701|300

BP TextA蓝图新建变量,类型选为BP TextB
Pasted image 20221212233743|300
用吸管吸一下Bp TextB,这样以进行在TextA蓝图类中获取TextB的蓝图类信息
Pasted image 20221212234003|300
这样做是有局限性的,只能是同一关卡内的蓝图类进行通信
不在关卡内的蓝图类如何影响其他蓝图类?通过中间变量(通常是玩家操控的Pawn)

通过中间变量进行信息的交互蓝图类与关卡蓝图之间的信息交互

通过Pawn控制蓝图类

在Pawn的蓝图里添加两个共有变量:
Pasted image 20221213101252
类型分别为对应的蓝图,并拾取
Pasted image 20221213101322
这样A与B就通过Pawn联系起来,可以相互调用

在A的蓝图中:
Get Player Pawn获取Pawn的控制
Cast To ThirdPersonCharacter:转换为Pawn的子类ThirdPersonCharacter
转换成功从上面引脚输出,转换失败从CastFailed输出

这样A就能访问修改B的信息
Pasted image 20221213102748

Get Player Pawn和Get Player Character区别:
Character范围更小,如果当前player是Pawn,那么使用Get Player Character就获取不到信息。
Pasted image 20221222141738

通过Pawn控制关卡蓝图

在关卡蓝图中,建立Custom Event
Pasted image 20221213103810

在Pawn蓝图中,使用Console执行控制台命令,Command输出ce 自定义事件名称
Pasted image 20221213103825

控制台命令

解释控制台命令工作原理:
关卡蓝图中自定义事件:
Pasted image 20230110234442
运行后按~调出控制台,按ce SpawnRobot可以执行该事件,如果该事件有input,如图所示,按ce SpawnRobot 123,即可打印出123
所以自定义事件输入的input可以通过控制台进行赋值

遍历搜索引用蓝图类

项目中,一个蓝图类可以使用多次,可能要求产生不同的交互,逐一修改比较麻烦。
在关卡蓝图中:
Get All Actors of class:获取指定蓝图类的所有Actor,以数组的形式
注意这样比较耗性能,一般使用Beginplay而不是每帧调用
Pasted image 20221213105928

通信方法

  • UE4/5中不存在无差别通信,只能一对一、一对多(具体)
  • 因此,蓝图通信的首要任务是设法获得通信对象的引用(reference)
  • 获得通信对象引用的方式包括: 指定/碰撞/创建/get (all) + cast to
    Pasted image 20221220171645
  • 蓝图通信有三种方式: 直接通信/蓝图接口/事件分发器 Pasted image 20221220171836
  • 蓝图通信是单向的

蓝图接口与事件分发器的选择
Pasted image 20230114140951

直接通信

Pasted image 20230114121331

  • 使用变量建立引用:打开眼睛(Instace Editable)
  • 关卡蓝图
  • **获取指定蓝图类的所有ActorGet All Actors of class**:注意这样比较耗性能,建议在BeginPlay时找到想要的Actor储存起来。
  • 获取指定Tag的所有ActorGet All Actors with Tag
    • 其他类似节点
    • Pasted image 20230115233244
    • Tag 设置方式:选择视口中的 Actor 在 Detail 面板中设置Pasted image 20230115232212
  • 直接 Spawn 另一个类,控制生成的实例Pasted image 20230824215953

类型转换Cast

“类型转换为”(Cast To)节点将引用变量类型转换为新指定的类型。在某些情况下,必须执行该操作才能访问类或蓝图的变量和函数。

蓝图转换 使用时机的几个例子:

  • 需要访问另一个蓝图的特殊版本。

    • 角色走进火焰中,导致体力值耗尽。
      • 转换到特殊的角色蓝图,以便访问并变更体力值。
    • 角色死亡,需要重新生成。
      • 转换到特殊的游戏模式蓝图,执行重新生成脚本。
  • 需要访问相同类的多个蓝图,并以相同方法进行修改。

    • 场景中拥有数盏灯,事件发生时需将它们开启或关闭。
      • 转换到灯蓝图并执行函数将灯关闭。
  • 需要访问一个特殊的子蓝图。

    • 存在基于一个动物蓝图(猫、狗、鸟)的数个蓝图,需要访问其中一个动物。
      • 转换到猫、狗和鸟,访问其相应的蓝图和特有功能。

蓝图接口interface

Pasted image 20230114124147
相当于 C++/C#中的纯虚函数/接口 [[1 C++ Primer#29. C++ 接口(纯虚函数)]]
Pasted image 20230113214503
蓝图接口(Blueprint Interface) 是一个或多个函数的集合 - 只有名称,没有实施(函数只可以设置input和output变量) -
可以添加到其他蓝图中。任何添加了该接口的蓝图都保证拥有这些函数。接口的函数 可以在添加它的每个蓝图中提供功能。在本质上,这类似于一般编程中的接口概念, 它允许多个不同类型的对象通过一个公共接口共享和被访问。简单地说,蓝图接口允许不同的蓝图相互共享和发送数据。

工具函数:
Pasted image 20230115233553|300

案例:
蓝图接口中创建一个函数StartInterface,只有一个input变量(发信方)
Pasted image 20230114134346
当接口中的函数没有设置output变量时,可以通过event来调用
Pasted image 20230114133346|200
三个角色蓝图命名如下,将接口分别添加到B1B3
Pasted image 20230114134607
Pasted image 20230114134847
Pasted image 20230114134556
A:按Q使用盒体检测对象宏,如果检测到则执行接口函数
Pasted image 20230114134722
GetCommuObject内部实现:
Pasted image 20230114135249
B1
B3:A执行接口函数时,B1~B3触发接口事件(当然这里可以自定义成不同的功能,如让角色进行移动等),在对话框中输出string
Pasted image 20230114134939
通过接口实现了不同的功能
Pasted image 20230114135045

当接口函数中有output变量时,则不能通过event调用接口,点击interface函数直接在图表中编辑即可实现功能。
Pasted image 20230114140236
Pasted image 20230114140204

事件分发器(发报机)

Event Dispatcher
Pasted image 20230114140755
事件分配器 使用时机的例子:

  • 需要从角色蓝图到关卡蓝图进行通信。

    • 玩家角色升级,需要开放之前锁定的区域。
    • 玩家角色按下行动按钮,对关卡执行某种操作。
  • 生成的 Actor 执行某种操作时触发事件。

    • 生成一个 Boss,Boss 被消灭时触发事件,在世界场景中生成一个奖励。
    • 在关卡中生成一个道具(武器、回复剂等)并在道具被拾起时告知道具和角色。

案例:
角色蓝图中创建事件分发器EventDispatchers
Pasted image 20230112232816
类似变量,如果类生成了两个实例,那么这两个实例的Dispacher是不同的。
还可以增加变量:
Pasted image 20230112232856
按1调用事件分发器:
Pasted image 20230112232915

设置两个蓝图类:绑定事件分发器,触发事件设置为增加一个粒子组件
Pasted image 20230112233027
意思就是每次按1,call函数被调用都会执行Bind绑定的emitter事件
效果如下
Pasted image 20230112233220

Unbind Event 节点可以从此列表中移除事件。 此外,通过 Unbind All Events 节点可以解除当前绑定到事件分发器上的所有事件。

13 角色蓝图制作

素材导入

使用Maya

导出模型骨骼

选择模型和骨骼,导出当前选择
Pasted image 20221213112521
必选:
注意这里只选了模型和骨骼,没有动画文件
Pasted image 20221213112611
Pasted image 20221213112644

导出动画

打开动画文件:
时间范围设置成和动画相同的帧数
导出前时间滑块归0
Pasted image 20221213112926

选择骨骼:
Pasted image 20221213112939
根骨骼》右键》选择层级
确保选择了骨骼的所有层级
Pasted image 20221213112957
编辑》关键帧》烘培模拟
讲所有骨骼和层级进行一次关键帧烘培,因为将角色动画导出为fbx格式,fbx不支持约束绑定和IK绑定。
Pasted image 20221213113108

选择模型和骨骼》导出当前选择》导出为fbx动画文件
其他选项和上文描述一样,勾选动画和烘焙动画、变形模型
Pasted image 20221213113339
Pasted image 20221213113428

导入ue4

导入模型骨骼FBX
创建Meshs文件夹
注意红框的设置,其他保持默认
Pasted image 20221213113728
导入成功
Pasted image 20221213113819

导入动画:
创建Anima文件夹
导入
Pasted image 20221213113952
选择对应骨骼,开启导入动画,关闭导入模型,其他默认
Pasted image 20221213114136
Pasted image 20221213114123

给模型赋予材质,检查动画是否正常

动画混合

Pasted image 20221213115712
Pasted image 20221213115751
Pasted image 20221213115813

创建动画混合

Pasted image 20221213115856
Blend Space 多线性混合,多条动画混合轨迹
1D 单线性混合,我们的角色动画比较简单,是一个线性过程

角色移动的动画混合

Pasted image 20221213120414
设置 奔跑时每秒4m
Pasted image 20221213120659
Pasted image 20221213120642

角色释放技能的动画混合

跳跃属于技能类型
Pasted image 20221213120823
创建动画蓝图,动画蓝图可以获取动画状态并将其输入动画状态机,通过动态状态机将动画播放
Pasted image 20221213121019

新建两个变量
Pasted image 20221213122732
Event Graph
Pasted image 20221213122748
Anim Graph
Pasted image 20221213122808
Pasted image 20221213122841
拖入speed变量和动画混合
Pasted image 20221213123157
拖入动画文件
Pasted image 20221213122903
Pasted image 20221213122912
Pasted image 20221213123222
修改判断机制:
Pasted image 20221213123316
Pasted image 20221213123344
Pasted image 20221213123355
Pasted image 20221213123407
Pasted image 20221213123415

角色蓝图

创建蓝图

Pasted image 20221213123648
默认模板:
Pasted image 20221213124050
选择Mesh导入模型和动画蓝图,调整和胶囊体的位置
Pasted image 20221213124115
Mesh下添加SpringArm弹簧臂和Camera组件
Pasted image 20221213124229

移动属性设置

Camrea属性中必须开启,否则鼠标不能移动视角
Pasted image 20221213124458
蓝图属性中必须关闭,否则人物转向的时候视角不会转向
Pasted image 20221213124745
移动属性中必须开启,开启后角色可以跟随旋转方向移动
Pasted image 20221213124954

设置按键

Pasted image 20221213125428

蓝图

鼠标视角移动:
Pasted image 20221213131459
前后左右移动:
Pasted image 20221213131542
跳跃
Pasted image 20221213131655
行走/跑步切换:
查看Character Movement属性:
Pasted image 20221213131939
Pasted image 20221213131924
通过控制最大行走速度就可以和状态机联动,例如当设置为100时就执行走路动画。
按1切换状态:lerp一下速度,让状态切换更平滑
Pasted image 20221213132538
Pasted image 20221213132619|300

设置控制者

将蓝图拖入viewport,设置蓝图属性
Pasted image 20221213130735

14 构造脚本

构造脚本(Construction Script)在蓝图对象创建时调用,或者在对象出现特定情况下调用,比如当对象移动、旋转、缩放,或有属性发生变动时,构造脚本会再次调用。构造脚本适合处理需要在游戏开始前计算的内容。

  • 游戏开始后,构造脚本将停止执行。此时,构造脚本执行的所有内容都将视为完成。
  • 关卡蓝图不含构造脚本。

通过RT案例理解构造脚本:在蓝图对象创建时调用,比如我们需要将材质绘制到一张RT
Pasted image 20230114205914
在BP_Test蓝图自定义事件调用DrawMaterialToRenderTarget,并在构造脚本中调用改事件
Pasted image 20230114210004
Pasted image 20230114210059
当我们把蓝图拖入 map 中,可以发现我们能还没有 play,就已经完成了绘制,即在对象创建时就已经调用了 Bask 事件。

当我们改变材质时,我们法线RT没有跟随变化,我们只需要改变蓝图的属性(当对象移动、旋转、缩放,或有属性发生变动时,构造脚本会再次调用)就可以更新RT。

15 RenderTarget

使用RT创建纹理

接上文,RT可以创建材质和静态纹理

  • 材质是动态的,随RT的改变而改变,本质就是将RT作为贴图传入BaseColor
  • 静态纹理是静态的
    Pasted image 20230114210802|300

限制:

  • 如渲染目标正在被用户指定的材质作为纹理进行采样,则无法对其进行绘制(RT 不能同时读写)。需要使用透明度混合在原处修改渲染目标;或在两个不同渲染目标之间来回切换。
  • 绘制到渲染目标时,材质只有 Emissive Color 和 Opacity 输出为有效。
  • 使用渲染目标和 World Position 之类的材质表达式节点时不支持灯光,可能返回非预想的结果。
  • Emissive Color 默认锁定为正,但启用材质属性 AllowNegativeEmissiveColor 即可输出负值。
    Pasted image 20230115151024

节点

蓝图和渲染目标参考 | 虚幻引擎文档 (unrealengine.com)
Pasted image 20230115151701
Create Render Target 2D
新建一个渲染目标并将其初始化到特定的有效维度。

Clear Render Target 2D
用给定的 Clear Color 清除特定的渲染目标。

Export Render Target
将渲染目标作为 HDR 图像导出到磁盘上。

Begin Draw Canvas to Render Target
返回一个可用于绘制到特定渲染目标的画布对象。需要调用 EndDrawCanvasToRenderTarget 完成渲染!
请注意:DrawMaterialtoRenderTarget 是更简单的版本,应尽多地替代 Begin/EndDrawCanvasToRT 使用。

End Draw Canvas to Render Target
必须和一个 BeginDrawCanvasToRenderTarget 组对,完成到渲染目标的渲染。

Draw Material to Render Target
用应用到特定渲染目标的材质渲染一个四边形。即时渲染目标已设置,此节点也会对其进行设置,这是一个开销大的运算。 如要将多个基元渲染到相同的目标区域,请使用 BeginDrawCanvasToRenderTarget / EndDrawCanvasToRenderTarget

16 动态材质实例

Create Dynamic Material Instance函数常用有两种:
Pasted image 20230116001636
Parent:指定母材质

设置材质参数值:
Pasted image 20230116002748
此外还可以设置材质参数集中的值
Pasted image 20230118171537|300

两种使用方式:都实现了将动态材质实例的BaseColor更改为蓝色,最终蓝图的Cube组件运行时呈现蓝色。
Pasted image 20230116002107
Pasted image 20230116002113
母材质只是简单设置了一个BaseColor变量
Pasted image 20230116002327|300

访问曲线图集

在蓝图中,你可以使用 获取曲线位置(Get Curve Position) 节点在动态材质实例上设置标量参数值。获取曲线位置(Get Curve Position)以曲线图集为输入,将标量值传递到 设置标量参数值(Set Scalar Parameter Value),然后返回一个布尔值来指示是否在图集中找到了曲线。
Pasted image 20230119193124

17 宏Macro

宏和函数的区别:

  • 可以自定义入口可出口数量
  • 宏在预处理阶段执行
  • 展开:蓝图被编译时,宏将复制所有图表节点, 并将它们粘贴到宏节点所在之处。
    Pasted image 20230112133519

总之,如果需要在各处重复使用一些功能,最好使用宏。但如果需要调整蓝图子项中的行为, 或需要从另一个蓝图直接进行访问,则最好使用函数!

18 调试

断点

Pasted image 20230110162656
Pasted image 20230110162713

观察变量值

运行时右键查看变量值
Pasted image 20230116003239

19 运行时生成Actor

SpawnActor
生成时公开(Expose on Spawn) 允许您设置变量是否应在生成其所在的蓝图时可访问。
Pasted image 20230115213840
上面我们有一个名为 光源颜色(LightColor) 的变量,它是一个设置为 生成时公开(Expose on Spawn) 的线性颜色属性。该变量在点光源的蓝图中实现,点光源使用 设置光源颜色(Set LightColor) 节点和 光源颜色(LightColor) 变量来确定光源的颜色。

下面,在另一个蓝图中,使用一个脚本来生成点光蓝图,由于 光源颜色(LightColor) 变量设置为生成时公开(Expose on Spawn),所以 从类生成Actor(Spawn Actor from Class) 节点上提供了设置此值的选项,这使我们能够在游戏世界中生成光源时设置其颜色。
Pasted image 20230115213917

20 书签bookmarks

bookmarks可以保存当前区域的蓝图,合理命名,快速找到该区域
Pasted image 20230112215526
打开bookmarks,还能检索注释节点!
Pasted image 20230112215835
Pasted image 20230112215821

21 数学表达式

操作符规则:虚幻引擎数学表达式节点 | 虚幻引擎5.1文档 (unrealengine.com)
Pasted image 20230113210157
Pasted image 20230113210232
双击可以查看生成的蓝图:
Pasted image 20230113210550

22 随机流Random

RandomStream变量:
Pasted image 20230113210659
变量开启instance Editable,则可以在蓝图类中设置初始种子
Pasted image 20230113211235

RandomStream函数:
Pasted image 20230113210807|300

23 时间轴TimeLine

只有事件支持时间轴
Pasted image 20230113211527
shift+左键快速增加关键帧

创建该节点后会自动生成一个TimeLine变量,可以执行相应的get set函数
Pasted image 20230113212750

24 在编辑器中调用蓝图事件/函数

蓝图类中自定义一个事件(函数也可以),勾选call in editor
Pasted image 20230113213928
Pasted image 20230113214051
在运行时通过点击控制打印操作
Pasted image 20230113213951

25 编辑器中创建蓝图类

选中视口中的actor,在右侧细节面板将actor转化为蓝图类
Pasted image 20230116003642

26 HUD蓝图类

落后了,现在都用UMG做UI

HUD即heads-up display,这是一类屏幕上的信息显示,用于快速访问重要信息。
.HUD在游戏中用于向玩家显示各种信息,如分数、时间、能量等。
在虚幻引擎中,HUD类是包含画布的基类,画布是可以绘制文本和纹理等Primitives的对象。
HUD类包含名为“接收绘制HUD”(Receive Draw HUD)的事件,该事件用于在每一帧绘制Primitives。
HUD类仅存在于每个客户端上,不进行网络同步。

创建HUD蓝图类

Pasted image 20230114215717
Event Graph中搜索Event Receive Draw HUD,有两个输入:
Size X:视口的宽度
Size Y:视口的高度
Pasted image 20230114215839

绘制

Draw Material节点:在HUD上绘制一个材质纹理的四边形图片。Pasted image 20230114221528
Pasted image 20230114221323
由中心点的位置各减去 ScreenX 和 ScreenY的一半,将图片绘制到屏幕中心位置。
Pasted image 20230114221706
Pasted image 20230114221809

27 样条线

蓝图样条组件 只是用于定义和使用位置数据的一个路径。可使用它在世界场景中移动 Actors(或其他 组件),或沿样条放置一系列的 Actors(或其他 组件)。它们可在蓝图视口和关卡编辑器中进行完整编辑,并能添加/移除/复制样条点,变更其切线类型、甚至按 tick 对其设置动画。此外,使用 蓝图构造脚本 也可对它们进行编辑,接受蓝图视口或关卡编辑器中进行的编辑并对它们进行进一步修改。

蓝图样条网格体组件 的使用情况则完全不同。它们将使单个 静态网格体 沿一个两点样条变形。无法对蓝图样条网格体组件添加更多样条点,但可通过蓝图完全控制两点。

蓝图中增加样条线组件
Pasted image 20230115153033

28 引脚设置

引脚设置:当命名为 execute 和 then 时,会隐藏引脚名称
Pasted image 20231202161953
Pasted image 20231202161911