type
Post
status
Published
date
Apr 23, 2026
slug
scs
summary
虚幻学习笔记:简单构造脚本。
tags
技术
思考
category
知识搬运
icon
password
fullWidth

Native Class与Blueprint Class

  • Native Class(原生类):用C++定义的类,会编译进模块DLL里
    • 类定义 = C++代码
    • 属性布局在编译期确定
    • 不依赖资源文件
  • Blueprint Class(蓝图类):继承自原生类或蓝图类的再编辑器里生成的数据驱动类,本质是UClass的实例
    • 引擎运行时生成UClass
    • 数据来自 .uasset
    • 包含:继承属性、蓝图新增属性、蓝图函数、类默认值(CDO)、Native组件、蓝图组件(SCS组件树)
notion image
比如Test_Actor这个蓝图类,它的Parent Class和Native Parent Class都是Actor;而Test_Actor_Child作为Test_Actor的派生类,它的Parent Class是Test_Actor_C,但Native Parent Class还是Actor
notion image
notion image
在蓝图里会同时存在两个类:Skeleton Generated Class 和 Generated Class
notion image

Skeleton Generated Class

蓝图骨架类(Skeleton Generated Class) 是在蓝图编译过程中生成的最小可用UClass,只包含类型结构信息(签名),不包含真实实现和运行数据。用于解决蓝图编译的循环依赖问题。
在编辑器中增删一些变量、接口、宏、函数,都会重新生成这个骨骼类,但如果只是修改某个函数的实现,该类不会重新生成。

Generated Class

蓝图类(Generated Class)是蓝图编译完成后生成的、真正参与运行的 UClass。它把C++类、父蓝图和当前蓝图的数据全部合并成一个最终类。

前后缀声明

蓝图骨架类以"SKEL"为前缀,"_C"为后缀;蓝图类以"_C"为后缀
notion image

蓝图产生类的实例化

蓝图产生类的实例化由两个过程构成——CDO构建和SCS组件附加

类默认对象

类默认对象(Class Default Object, CDO)是某个 UClass 的默认实例模板。
notion image
UObject* UClass::CreateDefaultObject()的源码很复杂
notion image
总体流程如下:
蓝图点击编译后,会先编译出父类的CDO,再以此来生成子类的CDO

简单构造脚本

简单构造脚本(SCS)是蓝图组件树的序列化描述
notion image
可以理解为组件面板里的组件树。在组件面板添加、删除、修改组件时,编译保存到SimpleConstructionScript中
notion image
USCS_Node是构建组件树的节点类(不是组件实例)在蓝图的组件面板中每添加一个组件,都会生成一个USCS_Node,Simple Construct Script的类对象中保存了Root NodesAll Nodes数组。
notion image
USCS_Node有几个关键字段:

继承逻辑

当子蓝图类初始化的时候,会先调用父蓝图类的SCS,添加父类的组件;再调用自己的SCS,添加自己的组件
bool AActor::ExecuteConstruction遍历蓝图产生类的栈,执行每个SCS
notion image

可继承组件处理器

虚幻为了支持子类修改从父类继承而来的组件的属性,蓝图产生类提供了可继承组件处理器(Inheritable Component Handler)
notion image
如果修改了某个从父类继承而来组件的属性值(Native父类无SCS除外),就会在当前蓝图的蓝图产生类的InheritableComponentHandlerRecords数组中存储修改后的组件实例,父类本身不会受影响
notion image
当执行某个USCS_Node并尝试添加一个组件时,会通过InheritableComponentHandler判断该组件是否被当前子类蓝图所修改过,若修改过,则会返回修改后的组件,否则仍然返回父类中默认的组件
notion image
其中有个重要方法GetAllTemplates,收集蓝图的所有继承父类的组件
notion image

SCS组件获取方式

例如,父类Test_Actor_C中添加了三个组件,子类Test_Actor_Child在继承父类基础上额外添加了Sphere组件。
notion image
notion image
运行时发现,子蓝图类Test_Actor_Child通过SimpleConstructionScript->GetAllNodes(),得到的个数不是4而是1(只有那个自身添加的Sphere被加入AllNodes里)
notion image
而通过InheritableComponentHandler->GetAllTemplate获取所有继承父类的组件,发现个数为3
notion image
而父蓝图类,调用相同的SimpleConstructionScript->GetAllNodes(),得到的个数是3
notion image
因此,如果要获得某个蓝图生成类中的所有SCS组件,需要遍历两部分内容:通过SimpleConstructionScript获得所有自身创建的组件节点,再从节点中获得组件;通过InheritableComponentHandler获得所有继承自父类的组件
notion image
【虚幻Slate】虚幻编辑器扩展之开发一个AVG游戏剧情编辑器【招聘笔试】CrossChess-井字棋单机小游戏
Loading...