UE4 动态增删查改Actor、BP
发表于2018-02-26
增
特殊说明:创建bp时,如果bp上随手绑一个cube,那么生成到场景的actor只执行构造不执行beginPlay,原因未知
ATPlayerPawn是c++类
直接动态创建actor
UWorld* const World = GetWorld();
FVector v = FVector(0, 0, 0);
FRotator r = FRotator(0, 0, 0);
if (World)
{
ATPlayerPawn* Player = World->SpawnActor<ATPlayerPawn>(v, r);
}
建立一个名为TPlayerPawnBP的蓝图,继承ATPlayerPawn
动态创建方法,3方法基本类似,随便记录下
1.可在运行时使用
FStringAssetReference asset = "Blueprint'/Game/bp/TPlayerPawnBP.TPlayerPawnBP'";
UObject* itemObj = asset.ResolveObject();
UBlueprint* gen = Cast<UBlueprint>(itemObj);
if (gen != NULL)
{
ATPlayerPawn* spawnActor = GetWorld()->SpawnActor<ATPlayerPawn>(gen->GeneratedClass);
}
2.可在运行时使用
UObject* loadObj = StaticLoadObject(UBlueprint::StaticClass(), NULL, TEXT("Blueprint'/Game/bp/TPlayerPawnBP.TPlayerPawnBP'"));
if (loadObj != nullptr)
{
UBlueprint* ubp = Cast<UBlueprint>(loadObj);
AActor* spawnActor = GetWorld()->SpawnActor<AActor>(ubp->GeneratedClass);
}
3.先保存蓝图类,然后运行时创建
.h中定义
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "N") TSubclassOf<ATPlayerPawn> doorBPClass;
.cpp构造中
static ConstructorHelpers::FClassFinder<ATPlayerPawn> doorBPClassFinder(TEXT("/Game/bp/TPlayerPawnBP"));
if (doorBPClassFinder.Class != nullptr)
{
UE_LOG(TLog, Warning, TEXT("NMgrActor Construct doorBP!=null"));
doorBPClass = doorBPClassFinder.Class;
}
.cpp BeginPlay中
UWorld* const World = GetWorld();
if (World)
{
World->SpawnActor<ATPlayerPawn>(doorBPClass);
}
4.运行时创建,大体思路都一样,只要找到bp类就行,注意这个路径有个_C
TSubclassOf<ATPlayerPawn> TS = LoadClass<ATPlayerPawn>(NULL,TEXT("Blueprint'/Game/bp/TPlayerPawnBP.TPlayerPawnBP_C'"));
GetWorld()->SpawnActor<ATPlayerPawn>(TS);
来自:http://blog.csdn.net/OnafioO/article/details/77990787
