CreateDefaultSubobject()

在上一节中,我们已经创建了一个 Pawn 类。在这一节中,我们使用 C++ 的方式,为其添加一个碰撞体。

我们可以使用 CreateDefaultSubobject() 函数来创建默认的组件,其原型为:

  • template<class TReturnType>
  • TReturnType* CreateDefaultSubobject(FName SubobjectName, bool bTransient = false);

TReturnType 指定想要创建的对象类型;SubobjectName 指定组件的名字,它需要在该类中唯一;bTransient 指定是否是瞬时对象,是否需要序列化保存到编辑器中。

为什么使用 CreateDefaultSubobject() 而不用 new?

CreateDefaultSubobject() 不仅仅做了对象创建的工作,还包括生命周期管理、反射支持、蓝图和编辑器支持等多项功能。

CreateDefaultSubobject() 只能在构造函数中使用。

如代码清单 1 所示,我们在构造函数中,使用 CreateDefaultSubobject() 函数创建了一个胶囊碰撞体。

代码清单 1 CreateDefaultSubobject
  1. // Sets default values
  2. ABasePawn::ABasePawn()
  3. {
  4.     // Set this pawn to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
  5.     PrimaryActorTick.bCanEverTick = true;
  6.  
  7.     CapsuleComp = CreateDefaultSubobject<UCapsuleComponent>(TEXT("Capsule Collider"));
  8.     RootComponent = CapsuleComp;
  9. }

接着我们将此 C++ 类拖拽到编辑器场景中。如图 1 所示,可以在场景中看到添加的碰撞体组件。

图1 Capsule Component

在代码清单 1 中还涉及了 RootComponent 变量,此处是把碰撞体设置为根节点。对应的可视化可以在图 1 的细节窗体中看到。

UE 中的组件父子关系和 blender 中的逻辑类似。我们移动或旋转一个节点,其下的所有子节点也会跟着一起移动和旋转。