在开发过程中,不可避免地会有一些蓝图的操作。同时,蓝图也是UE很有特色的一个内容。
了解蓝图是什么(What is BP?)
广义上:蓝图是UE内置的脚本语言,可以书写类似代码的逻辑。(任何可以连那种块块的可视化代码都可以视为蓝图)
狭义上:指Blueprint Class,即蓝图类,是一个和面向对象语言类似的概念。(蓝图也有继承关系,基类是Object类。蓝图相对于传统的C++代码,它可以组合资源实现逻辑,而C++只有实现逻辑的功能,并不能组合资源)
蓝图中易混淆的概念:
- 流程线:
· 通过白线连接,蓝图按照白线从前到后运行
· 并不是所有节点都有流程线
· 选中含有流程线的节点,按F9可以打上断点
· 断电后,F10每次执行一个流程节点(单步执行)
一个很长串的逻辑,不一定完全依赖于逻辑线,单纯的数据线就可以实现一个较为复杂的逻辑,
- 数据线:
· 通过各种彩色线(数据引脚)相连的节点,表示数据流动的方式与方向(颜色表示数据类型)
· 部分节点没有逻辑线,是纯粹的数据节点,最终必须作用于流程节点,否则数据不能被使用
· 我们把一个节点左侧的引脚叫“输入引脚”,右侧的箭头叫“输出引脚”
部分接口存在数据节点和流程节点两种形式,注意区分
· 每个数据输入引脚会重新计算所有数据流
数据节点:未连接流程线
流程节点:存在流程线
了解蓝图基本的使用方法
让我们打开UE5看一个例子吧!
打开全蓝图编译器
在Event Graph界面进行蓝图编辑
简单的理解如何优美的构建蓝图
事件分发器是蓝图中相较于C++现成的工具
事件分发器(EventDispatcher):
通过将一个或多个事件绑定到 事件分发器 ,可以在调用事件分发器时触发所有这些事件。这些事件可以绑定到蓝图类中。但事件分发器也允许在关卡蓝图中触发事件
· 可以绑定事件,每一个分发器有着自己的参数,事件必须匹配自身参数
· Dispatch接收外部的call并分发给所有绑定在自身下的Event
· Event可以绑定一个或多个Dispather,也可以在流程中解绑
新增事件分发器
添加参数
再分发器上绑定事件
通过事件输入引脚连入新的事件
· 如ActorBP中已有Event(如 Event End Play),也有Dispather(如End Play),通常我们使用了现成的Event,而没有关心内部的Dispather,我们也可以给原有的Dispather绑定自己的事件,或者创建新的Dispather或Event
函数(Function):
是属于特定蓝图(Blueprint)的节点图表,他们可以在蓝图中重复使用。函数具有一个由节点指定的单一进入点,函数的名称 包含一个执行输出引脚
纯函数(Pure Function):
· 函数可以为 纯 类型,纯函数承诺不以任何方式修改 状态 或类的成员
· 纯函数在调用时没有流程线,但在函数内部有
· 纯函数连接到数据引脚,当需要依赖它们的数据时,编译器会自动执行它们,对于纯函数连接到的每个节点,纯函数将被调用一次。
宏(Macro):
宏有一个有隧道节点指定的入口点和出口点,每个隧道都可以有任意数量的执行或数据引脚,当在其他蓝图或图表中使用时,这些引脚在宏节点中可见
· 宏不可继承
· 宏可以控制流程而函数并不可以
折叠节点(Collapse Nodes)
· 折叠节点是一堆节点的折叠
· 隶属于某一面板,不应该复用节点
· 仅起到简化蓝图的作用
了解蓝图的优劣
优点:
- 可视化编程
- 方便调参,快速开发
- 不需要编译,可以快速实现简单逻辑
- 语法糖多,可以缓解阅读压力
- 网上的教程和接口文档较多,方便查询
- 可以在实现逻辑的同时组合资源
缺点:
- 可视化编程,节点较多极其难以阅读
- 性能低下
- 不方便调试
- 接口类型多,混乱,不方便查找
- 难以实现较为复杂的运算或算法逻辑
- 难以修改UE提供的内容,拿不到基类数据结构,可实现逻辑较少
- 语法糖虽然多,但语法逻辑不清晰,连线没有约束,未定义行为极多
- 定义变量极其困难,数组操作繁琐
- 蓝图节点特殊性强,复用性弱
- Cast操作直接导致强引用,加载蓝图性能低下
- 使用蓝图难以理解游戏运行的方式