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组件树)

比如Test_Actor这个蓝图类,它的Parent Class和Native Parent Class都是Actor;而Test_Actor_Child作为Test_Actor的派生类,它的Parent Class是Test_Actor_C,但Native Parent Class还是Actor

在蓝图里会同时存在两个类:Skeleton Generated Class 和 Generated Class
Skeleton Generated Class
蓝图骨架类(Skeleton Generated Class) 是在蓝图编译过程中生成的最小可用UClass,只包含类型结构信息(签名),不包含真实实现和运行数据。用于解决蓝图编译的循环依赖问题。
在编辑器中增删一些变量、接口、宏、函数,都会重新生成这个骨骼类,但如果只是修改某个函数的实现,该类不会重新生成。
Generated Class
蓝图类(Generated Class)是蓝图编译完成后生成的、真正参与运行的 UClass。它把C++类、父蓝图和当前蓝图的数据全部合并成一个最终类。
前后缀声明
蓝图骨架类以"SKEL"为前缀,"_C"为后缀;蓝图类以"_C"为后缀
蓝图产生类的实例化
蓝图产生类的实例化由两个过程构成——CDO构建和SCS组件附加
类默认对象
类默认对象(Class Default Object, CDO)是某个 UClass 的默认实例模板。
UObject* UClass::CreateDefaultObject()的源码很复杂总体流程如下:
蓝图点击编译后,会先编译出父类的CDO,再以此来生成子类的CDO
简单构造脚本
简单构造脚本(SCS)是蓝图组件树的序列化描述
可以理解为组件面板里的组件树。在组件面板添加、删除、修改组件时,编译保存到SimpleConstructionScript中
USCS_Node是构建组件树的节点类(不是组件实例)在蓝图的组件面板中每添加一个组件,都会生成一个USCS_Node,Simple Construct Script的类对象中保存了Root Nodes和All Nodes数组。USCS_Node有几个关键字段:继承逻辑
当子蓝图类初始化的时候,会先调用父蓝图类的SCS,添加父类的组件;再调用自己的SCS,添加自己的组件
bool AActor::ExecuteConstruction遍历蓝图产生类的栈,执行每个SCS可继承组件处理器
虚幻为了支持子类修改从父类继承而来的组件的属性,蓝图产生类提供了可继承组件处理器(Inheritable Component Handler)
如果修改了某个从父类继承而来组件的属性值(Native父类无SCS除外),就会在当前蓝图的蓝图产生类的
InheritableComponentHandler的Records数组中存储修改后的组件实例,父类本身不会受影响当执行某个USCS_Node并尝试添加一个组件时,会通过
InheritableComponentHandler判断该组件是否被当前子类蓝图所修改过,若修改过,则会返回修改后的组件,否则仍然返回父类中默认的组件其中有个重要方法
GetAllTemplates,收集蓝图的所有继承父类的组件SCS组件获取方式
例如,父类Test_Actor_C中添加了三个组件,子类Test_Actor_Child在继承父类基础上额外添加了Sphere组件。
.png?table=block&id=34692264-0ce5-803d-bf47-f7878e79a330&t=34692264-0ce5-803d-bf47-f7878e79a330)
.png?table=block&id=34692264-0ce5-8075-8d04-d77335a9eea8&t=34692264-0ce5-8075-8d04-d77335a9eea8)
运行时发现,子蓝图类Test_Actor_Child通过
SimpleConstructionScript->GetAllNodes(),得到的个数不是4而是1(只有那个自身添加的Sphere被加入AllNodes里)而通过
InheritableComponentHandler->GetAllTemplate获取所有继承父类的组件,发现个数为3而父蓝图类,调用相同的
SimpleConstructionScript->GetAllNodes(),得到的个数是3因此,如果要获得某个蓝图生成类中的所有SCS组件,需要遍历两部分内容:通过
SimpleConstructionScript获得所有自身创建的组件节点,再从节点中获得组件;通过InheritableComponentHandler获得所有继承自父类的组件
- Author:Yuki
- URL:http://shirakoko.xyz/article/scs
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts




