CreateDefaultSubobject()
在上一节中,我们已经创建了一个 Pawn 类。在这一节中,我们使用 C++ 的方式,为其添加一个碰撞体。
我们可以使用 CreateDefaultSubobject() 函数来创建默认的组件,其原型为:
- template<class TReturnType>
- TReturnType* CreateDefaultSubobject(FName SubobjectName, bool bTransient = false);
TReturnType 指定想要创建的对象类型;SubobjectName 指定组件的名字,它需要在该类中唯一;bTransient 指定是否是瞬时对象,是否需要序列化保存到编辑器中。
为什么使用 CreateDefaultSubobject() 而不用 new?
CreateDefaultSubobject() 不仅仅做了对象创建的工作,还包括生命周期管理、反射支持、蓝图和编辑器支持等多项功能。
CreateDefaultSubobject() 只能在构造函数中使用。
如代码清单 1 所示,我们在构造函数中,使用 CreateDefaultSubobject() 函数创建了一个胶囊碰撞体。
- // Sets default values
- ABasePawn::ABasePawn()
- {
- // Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.
- PrimaryActorTick.bCanEverTick = true;
- CapsuleComp = CreateDefaultSubobject<UCapsuleComponent>(TEXT("Capsule Collider"));
- RootComponent = CapsuleComp;
- }
接着我们将此 C++ 类拖拽到编辑器场景中。如图 1 所示,可以在场景中看到添加的碰撞体组件。

在代码清单 1 中还涉及了 RootComponent 变量,此处是把碰撞体设置为根节点。对应的可视化可以在图 1 的细节窗体中看到。
UE 中的组件父子关系和 blender 中的逻辑类似。我们移动或旋转一个节点,其下的所有子节点也会跟着一起移动和旋转。