蓝图在影视中的应用
课程大纲
- 蓝图基础
- Variable,Function,Component
- Construction,Script
- Event
- 编辑器中的应用
- 蓝图工具
- Editor Utility Action(EUA)
- Editor Utility Widget(EUW)
- Spline工具
- Geometry Script
- 蓝图工具
- Debug,使用建议
蓝图基础:可视化编程脚本
蓝图是引擎提供的可视化编程脚本系统,我们在蓝图编辑器中通过连节点的方式,直观的搭特定的逻辑,编辑器里各个部件的组织方式,其实和C++代码的组织是类似的。
蓝图中的MyBlueprint对应的是C++的头文件,这里罗列声明了这个蓝图内的所有成员。首先有VARIABLES是各种类型的成员变量,在设置按钮上勾选show Inherited Variables 可以显示出继承自父类的变量。然后是FUNCTION成员方法,点击旁边的Override选项可以重载这个蓝图各级父类的方法。在具体的FUNCTION编辑模式下,我们还可以添加LOCAL VARIABLES局部变量
中间的节点流程图对应了C++的cpp文件,这里做具体的功能实现,编译时通过蓝图虚拟机这些节点被翻译成代码。项目中面对较为复杂的功能,我们通常会采取蓝图和C++协作的方案,先在C++中写一个基类框架,再在蓝图中对它做继承,重载和拓展。比较底层的复杂逻辑或数学运算会在C++中完成。通过反射系统暴露给蓝图调用。而比较上层的gameplay交互逻辑或特定的视觉效果的组装可以在蓝图中进行快速的迭代。
电灯泡实例class蓝图在编辑器中的基础操作
由于是放置在场景中交互的一个物件,我们先在内容浏览器中创建一个Actor为父类的蓝图。
蓝图编辑器中有三维视口,可以很方便的预览视觉效果。而视觉效果的搭建通常是从组装Component开始。
组装Component
每个Component类都封装了一些特定的通用的功能或者说解决方案。
我们先添加一个mesh来描述灯泡的外形,加一个点光源用来照明,还有一个碰撞盒来检测穿插。这些组件都属于SceneComponent,是可以放置在场景中摆放的,都带有Transform信息,不同的SceneComponent间还可以建立Transform层级。每个蓝图actor都会有一个默认的根节点,它是一个不可见的SceneComponent。由于后续的部件是挂在mesh上的,这里可以把它提到最上层来代替根节点。
我们希望不同的灯泡实例可以有颜色的变化,需要添加一个变量来定义它的颜色,并且把这个变量与点光源的颜色以及mesh的材质属性关联起来。
Variable的设置
创建一个名为LightColor的变量,类型为Linear Color,编译后可以设置默认值。
我们还可以在右边的Detail面板上设置变量的细节属性。
添加FUNCTION
在蓝图中新建一个Function取名为ChangeColor,然后添加颜色修改的逻辑。
Construction Script
调用添加颜色修改的逻辑使用Construction Script。
当蓝图实例被spawn到关卡时,或者在场景中对它做transform摆放以及各个属性的编辑调整时,Construction Script都会被调用。所以一般属性更新的响应都会放在这里。
蓝图属性动画
如果我们想在镜头里给灯泡的颜色进行k帧,首先在蓝图中把LightColor变量勾选向过场动画公开,这样才能在Sequencer中给它添加轨道。
另外还需要在类设置中勾选在Sequencer中运行构造脚本,就是说在Sequencer中的每一帧都需要执行Construction Script,这样蓝图的属性动画才能得到响应。
我们在镜头制作时应该多使用蓝图对复杂的效果进行封装。蓝图属性帮我们精简了Component的轨道数目。
Actor Sequence
我们可以把蓝图内各属性的动画,通过Actor Sequence Component也打包到蓝图类中去。这样这个动画就可以被很方便的复用。
启用这个功能需要打开Actor Sequence插件。
Event
当涉及不同object之间的联动和交互时就需要Event。
Event Graph中有三个默认添加的事件,分别是事件开始运行,事件Actor开始重叠和事件Tick。
- 事件开始运行 游戏开始运行后触发
- 事件Actor开始重叠 场景中不同Actor的Collision Volume 重叠时触发
- 事件Tick 每帧触发的事件,Tick是Runtime下性能耗费很高的事件。应该尽量避免在其中写复杂度很高的逻辑。
我们也可以添加自定义的事件。
Event和Function不同,Function可以自定义是否有返回值,在调用时我们等待函数执行直达它返回,Event没有返回值的触发后可能会涉及多线程的执行。因此我们在Event中可以添加并行的时间线做响应。
Level Blueprint
关卡蓝图是绑定在具体的umap上的逐关卡的蓝图脚本,一般用于调度场景中的各个actor,在前面的类蓝图里编辑器只知道当前这个蓝图类中有哪些Component,然后可以执行哪些操作。而在关卡蓝图中选择场景中的任意actor都可以创建它的引用,并且编辑器中会提示可以对它执行哪些操作。
Sequence Director Blueprint
Director Blueprint是调度各个轨道的蓝图脚本,把场景的的灯泡蓝图拖到轨道中给它添加一个事件轨道,这样我们就可以在某一特定时刻shift+中键设置一个关键帧,然后绑定一个事件进行触发。
Draw Material to RT
Draw Material to RT可以将某个材质的逻辑画到Render Target上这样就可以响应游戏逻辑中的射线检测的结果。
Content Example中也有Render Target在蓝图中应用的演示关卡。
小结
组成
Variable,Function,Component,Construction Script,Event…
按应用场景分类
- Class Blueprint
- Level Blueprint
- Sequence Director Blueprint
- Blutilliy
编辑器中的应用
蓝图工具
- Editor Utility Blueprint 常用来编写一些批处理脚本,常见的一般基于这两个父类,这两个分别管理场景中的Actor和项目中的资产
当项目中的资产量比较大,资产来源又比较杂的时候,往往我们更需要标准化的管理。我们可以根据项目具体的需求,通过Editor Utility Action对资产进行批量的规范设置。
以纹理为例,我们一般会按不同的材质通道为它使用的纹理,做标准的色彩空间,压缩格式,以及mipmap等设置。下面用一个脚本例子来进行这些设置。例子具体操作看学习视频。通过这个脚本我们可以快速的对纹理的设置进行批量处理。对其属性进行正确的修改。
- Editor Utility Widget 可以做带控件窗口的编辑器工具
下面介绍一个简单的场景Layout工具
这个工具的主要作用是对场景中摆放的的道具,批量的添加随机的位移和旋转,使得它看起来摆放的更自然。
按钮介绍
- Randomize按钮是执行随机的摆放,下面的勾选是设置是否对旋转,位移,大小都添加随机。
- Ray按钮是做垂直向下的射线检测,使得物体贴到离它最近的表面。
使用该工具让灯泡随机洒落在地上的方法
首先使用Randomize对灯泡方阵位置添加一些随机,再用Ray按钮让它们贴地。但这样只能让物体的轴心点贴地。所以我们使用Set Physic添加模拟。然后运行模拟,等物体掉落地面状态稳定后,点击快捷键K或者右键编辑器的保留物体状态功能,这样就可以的到灯泡随机掉落地面的场景。
Editor Utility 的使用
- 资产批处理
- 场景管理
- Layout
- 渲染质量分级设置
- 暴露常用CVar选项
- 场景中的模型编辑
- …
场景编辑深入
Spline Component
- 沿路径做物件摆放
- 沿路径变形splinemesh
- …
作用展示看内容示例中Blueprint Splines关卡
Geometry Script
- UE5,Experimental
- 生成/编辑/访问mesh数据的UFunction Library
- 提供蓝图和Python接口,大部分Runtime和Editor都可调用
模型处理接口:
Boolean,Subdivision,Extrude,Bevel,Revolve…
Displacement,PerlinNoise,Smooth,Twist,Bend…
Nearest Point on Mesh with BVH…
应用:
-
通过EUA EUW制作模型处理工具
地址(Engineering Fellow,Epic Games)
-
PCG
Lyra工程示例
Blueprint Debugger
- 断点
- 数据流
- 堆栈
使用建议
- 节点连线尽量不要过于复杂
- 节点整齐,必要地方加注释
- 逻辑复用:node macro function
Best Practice:
https://docs.unrealengine.com/4.27/en-US/ProgrammingAndScripting/Blueprints/BestPractices/