蓝图精粹
快捷键:虚幻引擎蓝图编辑器速查表
许多蓝图相关的函数带有 Kismet/K2 等字样,这都是遗留的东西,Kismet 是虚幻引擎早期版本中使用的一种脚本系统
1 事件
特点:支持“委托”,支持时间轴
委托Delegate
事件右上角有一个红色小正方形的事件称为委托。这只是对事件的引用。某些操作接收事件作为参数,并使用委托来实现事件。
在下图中,名为”时钟”(Clock)的自定义事件委托连线到”按事件设置定时器”(Set Timer by Event)节点的“事件”(Event)输入引脚,这样每一秒都会调用“时钟”(Clock)事件。
Actor 事件
Event Begin Play
游戏开始时将在所有 Actor 上触发此事件。游戏开始后生成的所有 Actor 上均会立即调用此事件。
Event End Play
Actor 从关卡中删除或移除时执行此事件。
Event Destroyed 函数的功能已合并到 EndPlay 函数。
Event Tick
游戏进程中每帧调用的简单事件。
Event OnReset
此蓝图事件节点仅在关卡蓝图中可用。
此蓝图事件节点仅在服务器上执行。在单人游戏中,本地客户端即视为服务器。
OnReset 事件在关卡重启时发出执行信号。 它在关卡重新加载后进行某项触发时非常实用。 如玩家角色已死亡,但关卡无需重新加载时。
Event Actor Begin Overlap
多项条件同时满足时,将执行该事件:
- Actor 之间的碰撞响应必须允许重叠。
- 执行事件的两个 Actor 的 Generate Overlap Events 均设为 true。
Event Hit
只要其中一个相关 Actor 的碰撞设置中 Simulation Generates Hit Events 设为 true,该事件便会执行。
Cursor
在关卡蓝图中设置如下:
ViewTarget
使用控制台命令
ViewActor actor_name 测试
Damage
对应触发蓝图:
Character 事件
跳跃发射落地下蹲
首先要保证 Movement 组件中勾选对应选项
使用蓝色函数触发事件
移动模式改变
Possess
Possess 触发时执行事件,用于切换控制角色
服务端事件
略
2 变量
变量公开为可编辑实例: 这样在面板上可以看到该变量
或
Tooltip: 设置鼠标悬停时的提示信息
修改变量信息: 搜索set
蓝图类通过按键操控需要修改input: 设置为Player0
右键分离引脚:
合并向量: Make Vector
Name
Name 类型适合作为变量名,不区分大小写。
我们可以使用该节点创建一个 Name 变量,而不需要按加号创建
Text
’
文本格式化 Format Text
用{}
表示一个输入值,可以设置多个,变量类型也可以是其他类型。
如果把 Text 设置成“默认值”,则输出如下:
合并文本: Append
文本内容判断: 相同返回 1
string
String 类型细节面板可以勾选 multi line,值可设定为多行(alt+enter 换行)
String 的操作
与 Text 类似,Trim Trailing 是删除尾部空白字符,Trim 是删除前面的空白字符,ToUpper 变大写,ToLower 变小写。
Time Second to String 是把时间变成 String,Get Time Second 起到了计数的作用,将时间传递给 Time Second to String。Event Tick 需要连接到 Print String 上,做到高频率输出。
其他: Right Pad,在源字符串后面加字节。
Right Chop 就是从第几个字符开始保留。Right,保留后 5 个字符串。
Reverse,反向排列。
Replace 和 Replace inline 没什么区别。都是把一个字符串中,某一个字符修改为另一个值。
String 的拆分
Parse Into Array
:分割字符串。以某个分隔符将字符串切割为多个数组。
与之相对应的是 Join String Array
,把多个数组以 Separator 为分隔符,压缩成一个字符串。
人宅老师课上说:这两对儿对于服务器和客户端之间的通信比较有用,是打包和解包过程中的一部分。
Mid 比较好理解,就是从第 i 个字符开始,截取 j 个字符,意味着字符从 i 到 i+j 被输出。这个与 Get Substring 一模一样。
Matches Wildcard:查看该 string 里有没有通配符(* 和?)如果有,则返回 true。
Is Numeric:看字符串是不是只有数字
Get Character as Number:把字符串转为 ASCII 码。
Get Character Array from String:把 String 里的字符串一个一个打印出来。比如输入 abcdegf,输出就是 a b c d e f g。这里要用循环一个一个打出来。
Find Substring:找子串。返回找到子串的首元素位置索引。
Contains: 查找是否有子串。
Append: 合成两个 String
3 控制流
Switch
根据print函数传入的index,如果为0则打印0,如果为0则打印1,如果不是0或1则打印error
Select
根据print函数传入的index,如果为0则打印0,如果为0则打印1
实现和上文Switch相同的功能:
Branch
快捷键:B
分支:如果输入为true,则从true输出;如果输入为flase,则从flase输出
Do Once/Do N
执行一次/N次
执行次数到达上限时不可继续执行,可以通过Reset重制次数
Flip Flop
交替执行
Gate
单门:
Enter:执行Exit时间
open:开启Enter
close:关闭Enter
Toggle(开关):可以在open和close之间切换
多门:
按1可以顺序输出out0和out1,顺序执行后结束
Is Random,随机输出
Loop,循环输出
Loop
While Loop
while循环
For Loop
for循环
For Loop with Break
多一个break条件,跳出循环
Sequnce
序列:顺序执行所有节点
Delay
延迟后执行,Duration单位为秒
可触发延迟在持续点击时,会不断刷新持续时间,直到最后一次点击才进行输出。
Timer定时器
定时器(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 关闭输入
Delay
Delay:如果在Duration时间内,Completed指向的事件再次被调用,不会立即执行,等duration结束方可执行。
Retriggerable Delay:如果在Duration时间内,Completed指向的事件再次被调用,会刷新duration时间,即连续调用会一直处于delay状态。
逻辑运算符
- and boolean(与)
- or boolean(或)
- not boolean(非)
4 空间位置变换
获取旋转平移缩放:
默认 rotation 为欧拉角
设置位置:
Sweep(扫描):移动时发生碰撞就会停止,如果关闭碰撞则穿透物体
Sweep Hit result:输出每一步的信息
移动:
局部坐标和世界坐标:
相对坐标:
相对父节点,比如类蓝图中:
Cube和Sphere的父节点都是DefaultSceneRoot
图中移动Cube,但是Sphere不会移动
在关卡蓝图中设置偏移量:
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) 将返回与追踪查找的对象类型匹配的所有对象,不会在其命中的首个物体上停止,假定组件设置为返回追踪查询。因此它很适合于计算追踪开始和结束之间的对象数量。
使用形状追踪
返回列表:
Impact Point 和 HitLocation 的区别:
HitLocation 是形状的中心,而 ImpactPoint 是实际与其他物体接触的点。
应用:剑刃长方形box的 impact point 位置确定
DrawDebugType
Trace节点有DrawDebugType选项,用于绘制测试追踪时有用的线条。绘制调试类型(Draw Debug Type)参数可以设置为以下某个值:
无(None):不绘制线条。
持续一帧(For One Frame):线条仅出现一帧。
持续时间(For Duration):线条在“绘制时间”(DrawTime)参数中指定的时间保持出现。
持久(Persistent):线条不消失。
要显示追踪颜色( Trace Color) 、追踪命中颜色( TraceHit Color)和绘制时间(Draw Time)参数,单击函数底部的小箭头。
从追踪获取UV坐标
Find Collision UV节点
如果使用Trace Complex,追踪可以返回它命中的Actor的UV坐标。
从4.14版起,此功能仅在 静态网格体组件、程序式网格体组件 和 BSP 上有效。它 无法 在 骨架网格体组件 上正常工作,因为你追踪的是 物理资源,而物理资源不具备UV坐标(即使你选择Trace Complex)。
使用此功能将增大CPU内存使用率,因为虚幻引擎需要在主内存中保留顶点位置和UV坐标的额外副本。
在 项目设置(Project Settings) 的 “物理(Physics)”部分 中启用 支持来自命中结果的UV(Support UV From Hit Results) 功能,启用后需要重启。
7 容器:数组/集合/映射
数组Array
创建数组
设置初始值
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
遍历数组
for each loop with break
遍历数组 ,多一个break条件
Append 追加数组
将第二个数组追加到第一个数组,第二个数组不会发生变化
Filter Array(过滤数组) 节点取入一个类型为Actor(或其任何子项)的数组,并基于输入的Class(类)过滤该数组。所得结果是一个新数组,仅包含原始数组中和相连的类的类型相匹配的项目。
Find Item(查找项目) 节点取入一个数组和一个变量,然后查找在数组中第一次找到那个变量的值时该值所处的索引编号。
集合Set
- 元素不允许重复
- 无序
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
也可称为 关联数组 或者 字典
- 存储键值对(Key-Value)
- Key不能重复
- 无序
Add
将一个键值对添加到Map。
Clear
清除Map的所有条目。
Contains
此节点检查是否提供的Map中有键存在。
Find
找到与提供的键相关联的值。
Keys
输出Map 中所有键的阵列。
Length
决定提供的Map中的条目数量。
Remove
从Map移除一个键值对。
Values
输出Map 中所有值的阵列。
8 结构体
创建结构体
break 分解
Set members 设置成员变量,引脚默认隐藏,可以设置开启
或者使用Set》Make方法:
结构体数组
结构体本身可以设置为结构体数组
结构体也可也添加数组变量
操作和普通数组类似,注意把引脚拆开
9 继承/多态
子类中显示继承的变量:
多态:子类重写父类的函数override
手动调用父类的函数:
创建子类
右键创建蓝图类:
点开子类,可以看到继承的部分
11 函数
数学函数
Lerp:插值
Interp To :插值到
lnterp To函数用于平滑地更改值,直到达到指定目标值。一些示例包括用于浮点值的FInterp To函数、用于矢量的VInterp To和用于旋转体的RInterp To函数。
输入
当前(Current) :当前值。
目标(Target):要达到的目标值。
时间差量( Delta Time):自上一次执行以来经过的时间间隔。
插值速度(Interp Speed):插值速度。输出
返回值(Return Value):更接近于目标值的新值。
纯函数
纯函数不修改状态或类的成员
如果执行顺序不重要且只是获得数值而不改变数值,那么就可以被标记为纯函数,不用关注什么时候执行(体现为不需要连接执行顺序白线),纯函数只能调用纯函数。
函数代码一致的情况下,两种节点可以看出不同:
纯函数
非纯函数
创建新函数,命名为PrintFunction
编辑函数:
在蓝图中使用:
函数局部变量
新建一个函数,双击函数既可以在Local variables中添加局部变量,局部变量尽在函数内部可见
12 蓝图通信
通信类型
关卡蓝图或蓝图类各自在蓝图之内的信息交互
Custom Event 自定义事件
关卡蓝图和蓝图类与场景内部的对象的通信
关卡蓝图
选中场景内的对象在蓝图中引用,通过get等获取数据
蓝图类
数据类型Static Mesh Actor,这里选择Object Reference
对象引用:引用场景中的实例对象
类引用:引用不在场景中的蓝图类
在Viewport中拾取目标Actor
这样就可以使用该变量表示拾取的Actor
动态Actor:
蓝图类之间的信息交互
创建两个蓝图类
BP TextA蓝图新建变量,类型选为BP TextB
用吸管吸一下Bp TextB,这样以进行在TextA蓝图类中获取TextB的蓝图类信息
这样做是有局限性的,只能是同一关卡内的蓝图类进行通信
不在关卡内的蓝图类如何影响其他蓝图类?通过中间变量(通常是玩家操控的Pawn)
通过中间变量进行信息的交互蓝图类与关卡蓝图之间的信息交互
通过Pawn控制蓝图类
在Pawn的蓝图里添加两个共有变量:
类型分别为对应的蓝图,并拾取
这样A与B就通过Pawn联系起来,可以相互调用
在A的蓝图中:
Get Player Pawn获取Pawn的控制
Cast To ThirdPersonCharacter:转换为Pawn的子类ThirdPersonCharacter
转换成功从上面引脚输出,转换失败从CastFailed输出
这样A就能访问修改B的信息
Get Player Pawn和Get Player Character区别:
Character范围更小,如果当前player是Pawn,那么使用Get Player Character就获取不到信息。
通过Pawn控制关卡蓝图
在关卡蓝图中,建立Custom Event
在Pawn蓝图中,使用Console执行控制台命令,Command输出ce 自定义事件名称
控制台命令
解释控制台命令工作原理:
关卡蓝图中自定义事件:
运行后按~调出控制台,按ce SpawnRobot
可以执行该事件,如果该事件有input,如图所示,按ce SpawnRobot 123
,即可打印出123
所以自定义事件输入的input可以通过控制台进行赋值
遍历搜索引用蓝图类
项目中,一个蓝图类可以使用多次,可能要求产生不同的交互,逐一修改比较麻烦。
在关卡蓝图中:
Get All Actors of class:获取指定蓝图类的所有Actor,以数组的形式
注意这样比较耗性能,一般使用Beginplay而不是每帧调用
通信方法
- UE4/5中不存在无差别通信,只能一对一、一对多(具体)
- 因此,蓝图通信的首要任务是设法获得通信对象的引用(reference)
- 获得通信对象引用的方式包括: 指定/碰撞/创建/get (all) + cast to
- 蓝图通信有三种方式: 直接通信/蓝图接口/事件分发器
- 蓝图通信是单向的
蓝图接口与事件分发器的选择
直接通信
- 使用变量建立引用:打开眼睛(Instace Editable)
- 关卡蓝图
- **获取指定蓝图类的所有Actor
Get All Actors of class
**:注意这样比较耗性能,建议在BeginPlay时找到想要的Actor储存起来。 - 获取指定Tag的所有Actor
Get All Actors with Tag
- 其他类似节点
- Tag 设置方式:选择视口中的 Actor 在 Detail 面板中设置
- 直接 Spawn 另一个类,控制生成的实例
类型转换Cast
“类型转换为”(Cast To)节点将引用变量类型转换为新指定的类型。在某些情况下,必须执行该操作才能访问类或蓝图的变量和函数。
蓝图转换 使用时机的几个例子:
需要访问另一个蓝图的特殊版本。
- 角色走进火焰中,导致体力值耗尽。
- 转换到特殊的角色蓝图,以便访问并变更体力值。
- 角色死亡,需要重新生成。
- 转换到特殊的游戏模式蓝图,执行重新生成脚本。
- 角色走进火焰中,导致体力值耗尽。
需要访问相同类的多个蓝图,并以相同方法进行修改。
- 场景中拥有数盏灯,事件发生时需将它们开启或关闭。
- 转换到灯蓝图并执行函数将灯关闭。
- 场景中拥有数盏灯,事件发生时需将它们开启或关闭。
需要访问一个特殊的子蓝图。
- 存在基于一个动物蓝图(猫、狗、鸟)的数个蓝图,需要访问其中一个动物。
- 转换到猫、狗和鸟,访问其相应的蓝图和特有功能。
- 存在基于一个动物蓝图(猫、狗、鸟)的数个蓝图,需要访问其中一个动物。
蓝图接口interface
相当于 C++/C#
中的纯虚函数/接口 [[1 C++ Primer#29. C++ 接口(纯虚函数)]]
蓝图接口(Blueprint Interface) 是一个或多个函数的集合 - 只有名称,没有实施(函数只可以设置input和output变量) -
可以添加到其他蓝图中。任何添加了该接口的蓝图都保证拥有这些函数。接口的函数 可以在添加它的每个蓝图中提供功能。在本质上,这类似于一般编程中的接口概念, 它允许多个不同类型的对象通过一个公共接口共享和被访问。简单地说,蓝图接口允许不同的蓝图相互共享和发送数据。
工具函数:
案例:
蓝图接口中创建一个函数StartInterface,只有一个input变量(发信方)
当接口中的函数没有设置output变量时,可以通过event来调用
三个角色蓝图命名如下,将接口分别添加到B1B3B3:A执行接口函数时,B1~B3触发接口事件(当然这里可以自定义成不同的功能,如让角色进行移动等),在对话框中输出string
A:按Q使用盒体检测对象宏,如果检测到则执行接口函数
GetCommuObject内部实现:
B1
通过接口实现了不同的功能
当接口函数中有output变量时,则不能通过event调用接口,点击interface函数直接在图表中编辑即可实现功能。
事件分发器(发报机)
Event Dispatcher
事件分配器 使用时机的例子:
需要从角色蓝图到关卡蓝图进行通信。
- 玩家角色升级,需要开放之前锁定的区域。
- 玩家角色按下行动按钮,对关卡执行某种操作。
生成的 Actor 执行某种操作时触发事件。
- 生成一个 Boss,Boss 被消灭时触发事件,在世界场景中生成一个奖励。
- 在关卡中生成一个道具(武器、回复剂等)并在道具被拾起时告知道具和角色。
案例:
角色蓝图中创建事件分发器EventDispatchers
类似变量,如果类生成了两个实例,那么这两个实例的Dispacher是不同的。
还可以增加变量:
按1调用事件分发器:
设置两个蓝图类:绑定事件分发器,触发事件设置为增加一个粒子组件
意思就是每次按1,call函数被调用都会执行Bind绑定的emitter事件
效果如下
Unbind Event 节点可以从此列表中移除事件。 此外,通过 Unbind All Events 节点可以解除当前绑定到事件分发器上的所有事件。
13 角色蓝图制作
素材导入
使用Maya
导出模型骨骼
选择模型和骨骼,导出当前选择
必选:
注意这里只选了模型和骨骼,没有动画文件
导出动画
打开动画文件:
时间范围设置成和动画相同的帧数
导出前时间滑块归0
选择骨骼:
根骨骼》右键》选择层级
确保选择了骨骼的所有层级
编辑》关键帧》烘培模拟
讲所有骨骼和层级进行一次关键帧烘培,因为将角色动画导出为fbx格式,fbx不支持约束绑定和IK绑定。
选择模型和骨骼》导出当前选择》导出为fbx动画文件
其他选项和上文描述一样,勾选动画和烘焙动画、变形模型
导入ue4
导入模型骨骼FBX
创建Meshs文件夹
注意红框的设置,其他保持默认
导入成功
导入动画:
创建Anima文件夹
导入
选择对应骨骼,开启导入动画,关闭导入模型,其他默认
给模型赋予材质,检查动画是否正常
动画混合
创建动画混合
Blend Space 多线性混合,多条动画混合轨迹
1D 单线性混合,我们的角色动画比较简单,是一个线性过程
角色移动的动画混合
设置 奔跑时每秒4m
角色释放技能的动画混合
跳跃属于技能类型
创建动画蓝图,动画蓝图可以获取动画状态并将其输入动画状态机,通过动态状态机将动画播放
新建两个变量
Event Graph
Anim Graph
拖入speed变量和动画混合
拖入动画文件
修改判断机制:
角色蓝图
创建蓝图
默认模板:
选择Mesh导入模型和动画蓝图,调整和胶囊体的位置
Mesh下添加SpringArm弹簧臂和Camera组件
移动属性设置
Camrea属性中必须开启,否则鼠标不能移动视角
蓝图属性中必须关闭,否则人物转向的时候视角不会转向
移动属性中必须开启,开启后角色可以跟随旋转方向移动
设置按键
蓝图
鼠标视角移动:
前后左右移动:
跳跃
行走/跑步切换:
查看Character Movement属性:
通过控制最大行走速度就可以和状态机联动,例如当设置为100时就执行走路动画。
按1切换状态:lerp一下速度,让状态切换更平滑
设置控制者
将蓝图拖入viewport,设置蓝图属性
14 构造脚本
构造脚本(Construction Script) 会在蓝图对象创建时调用,或者在对象出现特定情况下调用,比如当对象移动、旋转、缩放,或有属性发生变动时,构造脚本会再次调用。构造脚本适合处理需要在游戏开始前计算的内容。
- 游戏开始后,构造脚本将停止执行。此时,构造脚本执行的所有内容都将视为完成。
- 关卡蓝图不含构造脚本。
通过RT案例理解构造脚本:在蓝图对象创建时调用,比如我们需要将材质绘制到一张RT
在BP_Test蓝图自定义事件调用DrawMaterialToRenderTarget,并在构造脚本中调用改事件
当我们把蓝图拖入 map 中,可以发现我们能还没有 play,就已经完成了绘制,即在对象创建时就已经调用了 Bask 事件。
当我们改变材质时,我们法线RT没有跟随变化,我们只需要改变蓝图的属性(当对象移动、旋转、缩放,或有属性发生变动时,构造脚本会再次调用)就可以更新RT。
15 RenderTarget
使用RT创建纹理
接上文,RT可以创建材质和静态纹理
- 材质是动态的,随RT的改变而改变,本质就是将RT作为贴图传入BaseColor
- 静态纹理是静态的
限制:
- 如渲染目标正在被用户指定的材质作为纹理进行采样,则无法对其进行绘制(RT 不能同时读写)。需要使用透明度混合在原处修改渲染目标;或在两个不同渲染目标之间来回切换。
- 绘制到渲染目标时,材质只有 Emissive Color 和 Opacity 输出为有效。
- 使用渲染目标和 World Position 之类的材质表达式节点时不支持灯光,可能返回非预想的结果。
- Emissive Color 默认锁定为正,但启用材质属性 AllowNegativeEmissiveColor 即可输出负值。
节点
蓝图和渲染目标参考 | 虚幻引擎文档 (unrealengine.com)
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函数常用有两种:
Parent:指定母材质
设置材质参数值:
此外还可以设置材质参数集中的值
两种使用方式:都实现了将动态材质实例的BaseColor更改为蓝色,最终蓝图的Cube组件运行时呈现蓝色。
母材质只是简单设置了一个BaseColor变量
访问曲线图集
在蓝图中,你可以使用 获取曲线位置(Get Curve Position) 节点在动态材质实例上设置标量参数值。获取曲线位置(Get Curve Position)以曲线图集为输入,将标量值传递到 设置标量参数值(Set Scalar Parameter Value),然后返回一个布尔值来指示是否在图集中找到了曲线。
17 宏Macro
宏和函数的区别:
- 可以自定义入口可出口数量
- 宏在预处理阶段执行
- 展开:蓝图被编译时,宏将复制所有图表节点, 并将它们粘贴到宏节点所在之处。
总之,如果需要在各处重复使用一些功能,最好使用宏。但如果需要调整蓝图子项中的行为, 或需要从另一个蓝图直接进行访问,则最好使用函数!
18 调试
断点
观察变量值
运行时右键查看变量值
19 运行时生成Actor
SpawnActor
生成时公开(Expose on Spawn) 允许您设置变量是否应在生成其所在的蓝图时可访问。
上面我们有一个名为 光源颜色(LightColor) 的变量,它是一个设置为 生成时公开(Expose on Spawn) 的线性颜色属性。该变量在点光源的蓝图中实现,点光源使用 设置光源颜色(Set LightColor) 节点和 光源颜色(LightColor) 变量来确定光源的颜色。
下面,在另一个蓝图中,使用一个脚本来生成点光蓝图,由于 光源颜色(LightColor) 变量设置为生成时公开(Expose on Spawn),所以 从类生成Actor(Spawn Actor from Class) 节点上提供了设置此值的选项,这使我们能够在游戏世界中生成光源时设置其颜色。
20 书签bookmarks
bookmarks可以保存当前区域的蓝图,合理命名,快速找到该区域
打开bookmarks,还能检索注释节点!
21 数学表达式
操作符规则:虚幻引擎数学表达式节点 | 虚幻引擎5.1文档 (unrealengine.com)
双击可以查看生成的蓝图:
22 随机流Random
RandomStream变量:
变量开启instance Editable,则可以在蓝图类中设置初始种子
RandomStream函数:
23 时间轴TimeLine
只有事件支持时间轴
shift+左键快速增加关键帧
创建该节点后会自动生成一个TimeLine变量,可以执行相应的get set函数
24 在编辑器中调用蓝图事件/函数
蓝图类中自定义一个事件(函数也可以),勾选call in editor
在运行时通过点击控制打印操作
25 编辑器中创建蓝图类
选中视口中的actor,在右侧细节面板将actor转化为蓝图类
26 HUD蓝图类
落后了,现在都用UMG做UI
HUD即heads-up display,这是一类屏幕上的信息显示,用于快速访问重要信息。
.HUD在游戏中用于向玩家显示各种信息,如分数、时间、能量等。
在虚幻引擎中,HUD类是包含画布的基类,画布是可以绘制文本和纹理等Primitives的对象。
HUD类包含名为“接收绘制HUD”(Receive Draw HUD)的事件,该事件用于在每一帧绘制Primitives。
HUD类仅存在于每个客户端上,不进行网络同步。
创建HUD蓝图类
Event Graph中搜索Event Receive Draw HUD,有两个输入:
Size X:视口的宽度
Size Y:视口的高度
绘制
Draw Material节点:在HUD上绘制一个材质纹理的四边形图片。
由中心点的位置各减去 ScreenX 和 ScreenY的一半,将图片绘制到屏幕中心位置。
27 样条线
蓝图样条组件 只是用于定义和使用位置数据的一个路径。可使用它在世界场景中移动 Actors(或其他 组件),或沿样条放置一系列的 Actors(或其他 组件)。它们可在蓝图视口和关卡编辑器中进行完整编辑,并能添加/移除/复制样条点,变更其切线类型、甚至按 tick 对其设置动画。此外,使用 蓝图构造脚本 也可对它们进行编辑,接受蓝图视口或关卡编辑器中进行的编辑并对它们进行进一步修改。
蓝图样条网格体组件 的使用情况则完全不同。它们将使单个 静态网格体 沿一个两点样条变形。无法对蓝图样条网格体组件添加更多样条点,但可通过蓝图完全控制两点。
蓝图中增加样条线组件
28 引脚设置
引脚设置:当命名为 execute 和 then 时,会隐藏引脚名称