AddComponentsToLevelActor
动态给Level中的Actor添加组件
参考源码:\Engine\Source\Editor\SubobjectDataInterface\Public\SubobjectDataSubsystem.h
SubobjectDataSubsystem 提供大量对Level中Actor的操作函数:
cpp
/**
* Gather all subobjects that the given UObject context has. Populates an array of
* handles that will have the given context and all it's subobjects.
*
* @param Context Object to gather subobjects for
* @param OutArray Array to populate (will be emptied first)
*/
void GatherSubobjectData(UObject* Context, TArray<FSubobjectDataHandle>& OutArray);
////////////////////////////////////////////
// System events
/** Delegate invoked when a new subobject is successfully added */
FOnNewSubobjectAdded& OnNewSubobjectAdded() { return OnNewSubobjectAdded_Delegate; };
////////////////////////////////////////////
/**
* Gather all subobjects that the given Blueprint context has. Populates an array of
* handles that will have the given context and all it's subobjects.
*
* @param Context Object to gather subobjects for
* @param OutArray Array to populate (will be emptied first)
*/
UFUNCTION(BlueprintCallable, Category = "SubobjectDataSubsystem", meta = (DisplayName = "Gather Subobject Data For Blueprint"))
void K2_GatherSubobjectDataForBlueprint(UBlueprint* Context, TArray<FSubobjectDataHandle>& OutArray);
/**
* Gather all subobjects that the given actor instance has. Populates an array of
* handles that will have the given context and all it's subobjects.
*
* @param Context Object to gather subobjects for
* @param OutArray Array to populate (will be emptied first)
*/
UFUNCTION(BlueprintCallable, Category = "SubobjectDataSubsystem", meta = (DisplayName = "Gather Subobject Data For Instance"))
void K2_GatherSubobjectDataForInstance(AActor* Context, TArray<FSubobjectDataHandle>& OutArray);
/**
* Attempt to find the subobject data for a given handle. OutData will only
* be valid if the function returns true.
*
* @param Handle Handle of the subobject data you want to acquire
* @param OutData Reference to the subobject data to populate
*
* @return bool true if the data was found
*/
UFUNCTION(BlueprintCallable, Category = "SubobjectDataSubsystem", meta = (DisplayName = "FindSubobjectDataFromHandle"))
bool K2_FindSubobjectDataFromHandle(const FSubobjectDataHandle& Handle, FSubobjectData& OutData) const;
/**
* Attempt to find an existing handle for the given object.
*
* @param Context The context that the object to find is within
* @param ObjectToFind The object that you want to find the handle for within the context
*
* @return FSubobjectDataHandle The subobject handle for the object, Invalid handle if not found.
*/
UFUNCTION(BlueprintCallable, Category = "SubobjectDataSubsystem")
FSubobjectDataHandle FindHandleForObject(const FSubobjectDataHandle& Context, const UObject* ObjectToFind, UBlueprint* BPContext = nullptr) const;
////////////////////////////////////////////
// Modifying subobjects
/**
* Creates a new C++ component from the specified class type
* The user will be prompted to pick a new subclass name and code will be recompiled
*
* @return The new class that was created
*/
UFUNCTION(BlueprintCallable, Category = "SubobjectDataSubsystem", meta = (DisplayName = "Create New C++ Component"))
static UClass* CreateNewCPPComponent(TSubclassOf<UActorComponent> ComponentClass, const FString& NewClassPath, const FString& NewClassName);
/**
* Creates a new Blueprint component from the specified class type
* The user will be prompted to pick a new subclass name and a blueprint asset will be created
*
* @return The new class that was created
*/
UFUNCTION(BlueprintCallable, Category = "SubobjectDataSubsystem", meta = (DisplayName = "Create New Blueprint Component"))
static UClass* CreateNewBPComponent(TSubclassOf<UActorComponent> ComponentClass, const FString& NewClassPath, const FString& NewClassName);
/**
* Add a new subobject as a child to the given parent object
*
* @param Params Options to consider when adding this subobject
*
* @return FSubobjectDataHandle Handle to the newly created subobject, Invalid handle if creation failed
*/
UFUNCTION(BlueprintCallable, Category = "SubobjectDataSubsystem")
FSubobjectDataHandle AddNewSubobject(const FAddNewSubobjectParams& Params, FText& FailReason);
/**
* Attempts to delete the given array of subobjects from their context
*
* @param ContextHandle The owning context of the subobjects that should be removed
* @param SubobjectsToDelete Array of subobject handles that should be deleted
* @param BPContext The blueprint context for the given
*
* @return The number of subobjects successfully deleted
*/
UFUNCTION(BlueprintCallable, Category = "SubobjectDataSubsystem", meta = (DisplayName = "Delete Subobjects from Blueprint"))
int32 DeleteSubobjects(const FSubobjectDataHandle& ContextHandle, const TArray<FSubobjectDataHandle>& SubobjectsToDelete, UBlueprint* BPContext = nullptr);
/**