Blueprint 类实现

UBlueprintCore >

作为蓝图的基类,继承自UObject, 所有的Blueprint都将包含 SkeletonGeneratedClass 和 GeneratedClass 两个属性

主要成员变量

  1. TSubclassOf SkeletonGeneratedClass: 指向skeleton class的指针,每当向蓝图中添加一个变量或者函数时,都会重新生成skeleton class
  2. TSubclassOf GeneratedClass: 指向全编译class的指针,通常使用的都是这个class,其内部的属性都被填充,可以完整的描述一个蓝图。由于蓝图类class是就地编译的,因此不管编译几次,这个指针都不需要改变。
  3. bLegacyNeedToPurgeSkelRefs: 向后兼容:是否需要将此蓝图中的引用清除为加载时编译生成的框架
  4. GenerateNewGuid(): 创建 Blueprint 时,创建Guid
  5. FGuid GetBlueprintGuid(): 获取Guid

UBlueprint >

负责实现蓝图的主要功能,包括蓝图属性、蓝图函数、节点连接关系等所有蓝图信息

image

主要成员变量:

  1. TSubclassOf ParentClass: 指向蓝图类父类的UClass。会注册到AssetRegistryTags中,以支持蓝图预览。

    1. Blueprint 和 父类之间并不是继承关系,其实是组合关系,ParentClass 指向 Blueprint 的 父类
    2. ParentClass 返回的也是Blueprint 父类的包装类, 真正的父类实例使用 ClassDefaultObject 获取
      const auto MyActor = Cast<Actor>(Blueprint->ParentClass->ClassDefaultObject);
      const auto MyAnimInstance = Cast<AnimInstance>(AnimBlueprint->ParentClass->ClassDefaultObject);
      image
      image
  2. TArray<UEdGraph*> UbergraphPages: 所有ubergraphpages,一个ubergraph就是编辑器左侧显示的一个eventgraph,里面会包含所有event的实现,在蓝图编译时,它们会被复制到一个大的ubergraph中

  3. TArray<UEdGraph*> FunctionGraphs: 所有函数graph(ConstructionScript, UAnimationGraph)
    image
    image

  4. TArray<UEdGraph*> DelegateSignatureGraphs: 所有事件代理Graph

  5. TArray<UEdGraph*> MacroGraphs: 所有这个蓝图实现的宏

  6. TArray<UEdGraph*> EventGraphs: 所有的Event声明

  7. TArray<class UTimelineTemplate*> Timelines: 蓝图中的Timeline,timeline需要被特别处理

  8. TArray NewVariables:这个蓝图自己创建的变量,不包含从父类继承的,在编译时会添加到BlueprintGeneratedClass中

  9. TArray<class UBreakpoint*> Breakpoints: 断点集合,用于调试

** 蓝图编译过程就是把UBlueprint描述的信息转换为BlueprintGeneratedClass的过程 **

UAnimBlueprint >

Anim Blueprint本质上是一种专用的Blueprint,其图形控制着Skeletal Mesh的动画。 它可以执行动画混合,直接控制骨骼的骨骼,并在每帧中输出“骨架网格物体”的最终姿势。

主要成员变量:

  1. USkeleton* TargetSkeleton : 此蓝图动画所用的的骨骼资源,动画蓝图编辑器中也会根据此骨骼列出所有此骨骼的动画

image

UEdGraph >

节点数据的容器

image

  1. TSubclassOf<class UEdGraphSchema*> Schema: 这个图要遵循的schema
  2. TArray<class UEdGraphNode*> Nodes: 图中的所有节点
  3. TArray<class UEdGraph*> SubGraphs: 这个图包含的子图,一个例子就是动画蓝图的状态机,状态机就作为子图存在

UEdGraphSchema >

Schema 是与 Graph对应的,约定了当前Graph能创建什么样的节点、两个引脚能否产生连接等等。类的继承关系如下

相当于 Graph 工具类

image

  1. GetGraphContextActions(): 在当前蓝图的空白处单击右键出现的节点菜单栏,列出了当前Graph能添加的所有节点
  2. GetContextMenuActions(): 在节点或引脚上右键出现的操作菜单栏,比如deletelink、break等
  3. CanCreateConnection(): 传入两个引脚,判断两个引脚间能否建立连线。返回的并不是一个boo值,而是枚举ECanCreateConnectionResponse,包含了更多信息

UEdGraphNode >

一个图由许多节点组成,比如上面的Graph例子图片,每个节点都有自己的功能,就像一个个砖块,节点的基类为UEdGraphNode。上面提到了多种图,因此也会有和图对应的节点。而UK2Node比较特别,因为它是所有蓝图节点的基类,这里说的蓝图节点就是普通意义上的蓝图节点,例如ifelse、方法调用、for循环等。节点的继承关系如下

image

  1. TArray<UEdGraphPin*> Pins: 节点上的所有引脚
  2. int32 NodePosX,NodePosY,NodeWidth,NodeHeight: 节点的位置,长宽,在展开时会用到,避免节点间产生重叠

UBlueprint, UAnimBlueprint, UEdGraphSchema, UEdGraph, UEdGraphNode 关系

  1. UBlueprint 是包含蓝图所有的信息类
  2. UAnimBlueprint 一种特殊的 UBlueprint, 用于控制动画
  3. UEdGraph 包含 所有 蓝图节点(UEdGraphNode)的容器
  4. UEdGraphSchema 操作 UEdGraph 上节点(UEdGraphNode)的工具类

参考:
https://zhuanlan.zhihu.com/p/69067129