【Bp2Lua】深入理解蓝图
做 Bp2Lua 过程中的副产物,蓝图在连连看背后隐含的操作
有几点想说明的
- 蓝图会隐含一些操作,前端节点图是看不出来的,但是后端字节码会一览无余
- Bp2Lua 本质是 字节码 ToLua,其实 Bp2Lua 根本不关心也不知道前端是蓝图
- 通过 Bp2Lua 反推来理解 蓝图的行为
大纲
分两部分,先讲讲蓝图的本质,然后列举我收集到的一些隐含操作
蓝图的本质
蓝图的本质是对引擎的可视化
分为两部分
- 数据结构:以反射为核心的对象模型,扩展出众多引擎类
- 函数:一般的 VM 执行,实际还是在 UObject 实现的,没有 VM 类
所以重点还是对象模型
基类,Asset 里的 Blueprint Class,即 UBlueprint 类,对应 UClass
然后扩展出子类,并且某些类可以特化出编辑器,比如 UMG,AnimBP 状态机
和一般的脚本(Lua)不同,蓝图的前端就是整个蓝图编辑器
- 编译,蓝图必须编译成 UClass
- EventGraph,多个 EventGraph 编译成一个 UberGraph
- 函数列表,UFunction
- 属性列表,UProperty
- 节点图,蓝图函数体编译到字节码,存在 UFunction.Code
- 细节面板,略
蓝图的执行流和数据流
白色的线是执行流/控制流,顺序执行,Sequence,Branch,ForLoop,回调函数
引脚和彩色线是数据流,对应参数,变量,颜色代表数据类型
设置 Replicated 变量
蓝图
生成 Lua
节点可以生成更多节点,红圈是节点额外生成的代码,处理网络属性同步
隐含的 Cast
这里隐含生成了一条 Double2Float Cast 指令
调用 Interface
Target 先 DynamicCast 到 Interface 需要的类型,Cast 成功再调用,否则忽略
纯函数
纯函数连出来的线,每一条都会重新算一次