实际上该功能可以通过纯蓝图写出,以下展示蓝图中如何操作构造器

仅需在创建"自定义事件"的时候勾选"编辑器中调用"属性,然后就可以直接在蓝图中生成
但同时,我们发现"从类生成Actor"该蓝图节点具有生成局限性
无法在当前关卡外生成
以及无法生成某些在蓝图中公开却不在该节点"Class"属性中公开的Actor例如"PostProcessVolume"
当遇到上述局限性时,考虑蓝图无法解决该问题,此时我们需要C++介入
此处以PostProcessVolume为例子
.h
UFUNCTION(BlueprintCallable, Category = "Akie Tools")
static void SpawnMyActor(UWorld* World, UClass* Class, FVector const& Location);
.cpp
void UakietoolsBPLibrary::SpawnMyActor(UWorld*World, UClass* Class, FVector const& Location)
{
if (Class) {
if (World) {
World->SpawnActor<APostProcessVolume>(Class, Location, FRotator(0.f));
}
}
}
实际上 由于超高的解耦性
上述代码可以在更改了UFUNCTION(中的规范)后源码直接迁移到蓝图宏库的插件中
UFUNCTION(BlueprintCallable, meta = (DisplayName = "SpawnClass", Keywords = "AKieTools sample test testing"), Category = "AKieSpawnTools")

在蓝图中如此调用即可,注意 该变量类型为场景(World)常规搜索不到
复制下述代码到蓝图的创建变量栏粘贴就创建了该变量
BPVar(VarName="指认当下关卡",VarGuid=DCB2E34241C4E6C912199E987236928E,VarType=(PinCategory="softobject",PinSubCategory="",PinSubCategoryObject=Class'"/Script/Engine.World"',PinSubCategoryMemberReference=(MemberParent=None,MemberName="",MemberGuid=00000000000000000000000000000000),PinValueType=(TerminalCategory="",TerminalSubCategory="",TerminalSubCategoryObject=None,bTerminalIsConst=False,bTerminalIsWeakPointer=False,bTerminalIsUObjectWrapper=False),ContainerType=None,bIsReference=False,bIsConst=False,bIsWeakPointer=False,bIsUObjectWrapper=True,bSerializeAsSinglePrecisionFloat=False),FriendlyName="指认当下关卡",Category=NSLOCTEXT("KismetSchema", "Default", "Default"),PropertyFlags=5,RepNotifyFunc="",ReplicationCondition=COND_None,MetaDataArray=((DataKey="MultiLine",DataValue="true")),DefaultValue="None")
文章介绍了如何通过蓝图实现自定义事件,并讨论了蓝图在生成Actor时的局限性,特别是对于特定类型如PostProcessVolume。当蓝图无法解决问题时,建议使用C++介入。提供了一个C++函数示例用于动态生成Actor,并展示了如何在蓝图中调用此函数。
6924

被折叠的 条评论
为什么被折叠?



