定义一个CallInEditor的函数:
cpp
UFUNCTION(BlueprintCallable, CallInEditor)
void AddGenerateComponent();
直接AddComponent,会在移动后消失,且反射没法找到生成的组件。这里需要用到USubobjectDataSubsystem,需要在Build.cs内部添加模块:SubobjectDataInterface,代码如下:
cpp
void AAEGenerator::AddGenerateComponent()
{
if (USubobjectDataSubsystem* Subsystem = Cast<USubobjectDataSubsystem>(GEngine->GetEngineSubsystemBase(USubobjectDataSubsystem::StaticClass())))
{
TArray<FSubobjectDataHandle> OutArray;
Subsystem->GatherSubobjectData(this, OutArray);
if (OutArray.Num() > 0)
{
FAddNewSubobjectParams Params;
Params.ParentHandle = OutArray[0];
Params.NewClass = UGeneratorComponent::StaticClass();
FText FailedReason;
FSubobjectDataHandle Handle = Subsystem->AddNewSubobject(Params, FailedReason);
if (Handle.GetData())
{
if (UGeneratorComponent* GeneratorComponent = const_cast<UGeneratorComponent*>(Cast<UGeneratorComponent>(Handle.GetData()->GetObject())))
{
GeneratorComponent->AttachToComponent(Root, FAttachmentTransformRules::KeepRelativeTransform, NAME_None);
GeneratorComponent->SetRelativeTransform(FTransform::Identity);
GeneratorComponent->RegisterComponent();
}
}
}
}
}