向Unreal编辑器关卡中拖入自定义类型

来源:互联网 发布:java设置pdf打印格式 编辑:程序博客网 时间:2024/05/22 02:21

  • 最终效果
    • 希望直接拖入编辑生成Actor的类定义
    • 继承UActorFactory
    • 蓝图继承UItem设置StaticMesh属性

最终效果

最终效果

“希望直接拖入编辑生成Actor的类”定义:

NOTE:这边只处理了蓝图类的情况,请在编辑器里用蓝图类继承该类做实验

UCLASS(Blueprintable)class PROJECTNAME_API UItem : public UObject{    GENERATED_BODY()public:    UPROPERTY(EditAnywhere, Category = "Item")    UStaticMesh* StaticMesh;};

继承UActorFactory

1、继承UActorFactory
2、修改构造函数,给NewActorClass 赋值
3、重写UActorFactory中的函数,CanCreateActorFrom, PostSpawnActor

类定义

UCLASS()class PROJECTNAME_API UActorFactoryItem : public UActorFactory{    GENERATED_BODY()public:    UActorFactoryItem();    virtual void PostSpawnActor(UObject* Asset, AActor* NewActor) override;//该函数用于处理产生的Actor    virtual bool CanCreateActorFrom(const FAssetData& AssetData, FText& OutErrorMsg) override; //该函数用于判断是否能SpawnActor于视图中};

类实现

UActorFactoryItem::UActorFactoryItem(){    DisplayName = NSLOCTEXT("Item", "Item", "Item Static Mesh");    NewActorClass = AStaticMeshActor::StaticClass(); //设置拖入场景Spawn的Actor    bUseSurfaceOrientation = true;}bool UActorFactoryItem::CanCreateActorFrom(const FAssetData& AssetData, FText& OutErrorMsg){    if (!AssetData.IsValid() || !AssetData.GetClass()->IsChildOf(UBlueprint::StaticClass()))    {        OutErrorMsg = NSLOCTEXT("CanCreateActor", "NoStaticMesh", "A valid static mesh must be specified.");        return false;    }    const FString* ParentClassPath = AssetData.TagsAndValues.Find(TEXT("ParentClass"));    if (ParentClassPath == NULL || ParentClassPath->IsEmpty())    {        OutErrorMsg = NSLOCTEXT("CanCreateActor", "NoBlueprint", "No Blueprint was specified, or the specified Blueprint needs to be compiled.");        return false;    }    UClass* ParentClass = FindObject<UClass>(NULL, **ParentClassPath);    bool bIsActorBased = false;    if (ParentClass != NULL)    {        // The parent class is loaded. Make sure it is derived from AActor        bIsActorBased = ParentClass->IsChildOf(UItem::StaticClass());        return bIsActorBased;    }    return false;}void UActorFactoryItem::PostSpawnActor(UObject* Asset, AActor* NewActor){    Super::PostSpawnActor(Asset, NewActor);    UBlueprint* ItemBlueprint = CastChecked<UBlueprint>(Asset);    UClass* ItemClass = CastChecked<UClass>(ItemBlueprint->GeneratedClass); //从蓝图类中生成UClass    UItem* Item = CastChecked<UItem>(ItemClass->GetDefaultObject());    //UE_LOG(LogActorFactory, Log, TEXT("Actor Factory created %s"), *StaticMesh->GetName());    // Change properties    AStaticMeshActor* StaticMeshActor = CastChecked<AStaticMeshActor>(NewActor);    UStaticMeshComponent* StaticMeshComponent = StaticMeshActor->GetStaticMeshComponent();    check(StaticMeshComponent);    StaticMeshComponent->UnregisterComponent();    StaticMeshComponent->StaticMesh = Item->StaticMesh;    //    StaticMeshComponent->StaticMeshDerivedDataKey = Item->StaticMesh->RenderData->DerivedDataKey;    // Init Component    StaticMeshComponent->RegisterComponent();}

蓝图继承UItem,设置StaticMesh属性

最后将蓝图拖入编辑器的场景就可以看到效果。

原创粉丝点击