UEC++ 创建默认子对象CreateDefaultSubobject

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 是在构造阶段创建并注册默认组件的函数,使组件能被编辑器、蓝图和引擎系统正确识别与管理。

相关推荐
牵猫散步的鱼儿1 小时前
C++ 内存分区
c++
choumin1 小时前
C++ 标准容器为什么不能存引用
c++·容器·引用类型
谙弆悕博士1 小时前
用 C 写了个 Windows 聊天室,踩了几个多线程和控制台的坑
c语言·开发语言·c++·windows·网络编程·聊天室
stolentime2 小时前
CF2277E Tree Guessing题解
c++·算法·贪心算法·交互·ad-hoc
syagain_zsx3 小时前
ODB 与 MySQL:C++ 里的 ORM 实践(类即表、事务铁律与查询封装)
开发语言·数据库·c++·mysql·工具库·1024程序员节
小鱼仙官3 小时前
使用Qt封装C/C++ 动态库 用于第三方调用
c语言·c++·qt
晚风予卿云月4 小时前
【C++高并发内存池】 1.定长内存池的实现
开发语言·c++·内存管理
闻缺陷则喜何志丹5 小时前
【c++20】协程与屏障
c++·算法·c++20·携程·屏障
会编程的小孩5 小时前
C++ 内存分区、堆与栈、static、union 完整修正版文档
c++
多弗朗皮卡丘5 小时前
C++的类型转换
开发语言·c++