CreateDefaultSubobject 是 Unreal Engine C++ 里非常常见、非常核心的函数,用来在 构造函数(Constructor) 里创建组件(Component)用的。
比如你在一个 AActor 或 APawn 的构造函数中看到👇这种写法:
cpp
USkeletalMeshComponent* Mesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("Mesh"));
✅ 一句话解释
CreateDefaultSubobject用于在构造阶段为 Actor 或 Object 创建子对象(组件),并让引擎正确地管理它(包括反射、序列化、蓝图编辑可见等)。
🔹 语法
cpp
template <class T> T* CreateDefaultSubobject(FName SubobjectName, bool bTransient = false);
-
T:你想创建的子对象类型,比如UStaticMeshComponent、USphereComponent。 -
SubobjectName:子对象的名字(在蓝图或详情面板中显示用)。 -
返回值 :新创建的对象指针(类型是
T*)。
🔹 典型用法(放在构造函数里)
cpp
AMyCharacter::AMyCharacter() { // 创建胶囊体碰撞组件 CapsuleComponent = CreateDefaultSubobject<UCapsuleComponent>(TEXT("Capsule")); RootComponent = CapsuleComponent; // 设为根组件 // 创建网格体组件 Mesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("Mesh")); Mesh->SetupAttachment(RootComponent); // 附加到根组件 }
⚠️ 注意:只能在构造函数里调用,因为这时引擎还在构建对象的模板(CDO)。
🔹 为什么不能用 NewObject?
-
NewObject用于运行时动态创建对象; -
CreateDefaultSubobject用于构造时创建默认组件; -
用
NewObject创建的组件不会被编辑器识别,不会在蓝图里可见,也不参与反射系统; -
而
CreateDefaultSubobject创建的会自动被注册到反射系统、保存、复制等机制。
🔹 简单对比
| 函数 | 使用场景 | 生命周期 | 是否反射可见 |
|---|---|---|---|
CreateDefaultSubobject |
构造函数中创建默认组件 | 随 Actor 一起创建 | ✅ 是 |
NewObject |
运行时动态创建对象 | 手动管理 | ❌ 否(默认) |
SpawnActor |
世界中生成 Actor | 运行时 | ✅ 是 |
🔹 举例理解
比如你想做一个带灯光的道具:
cpp
AItemLight::AItemLight() { Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh")); RootComponent = Mesh; PointLight = CreateDefaultSubobject<UPointLightComponent>(TEXT("Light")); PointLight->SetupAttachment(Mesh); }
然后在蓝图里就能看到:
-
一个 Mesh
-
一个 Light
这两个都是 "默认子对象",能被修改、保存、复制。
🔹 总结一句话
CreateDefaultSubobject是在构造阶段创建并注册默认组件的函数,使组件能被编辑器、蓝图和引擎系统正确识别与管理。