UE4 C++ 通过类的名称动态生成类的对象(运行时生成UObject、ENUM、UBP)

FindObject:只从内存中寻找
LoadObject:如果内存中找不到会去外部找

1、动态生成UObject实例、
	//通过UClass方式获取
	UClass* RefObjClass = StaticLoadClass(UObject::StaticClass(), nullptr, TEXT("URefObj"));
	URefObj* RefObj = Cast<URefObj>(RefObjClass);
	RefObj->DoDebug();
	//通过UObj获取
	UObject* RefObjPtr = StaticLoadObject(UObject::StaticClass(), nullptr, TEXT("URefObj"));
	URefObj* RefObj2 = Cast<URefObj>(RefObjPtr);
	RefObj->DoDebug();
	//两者获取到的是同一个对象
	if (RefObj==RefObj2)
	{
		if (GEngine)
		{
			GEngine->AddOnScreenDebugMessage(-1, 100.f, FColor::Yellow, FString("Same"));
		}
	}
运行结果:

在这里插入图片描述

2、动态生成ENUM实例
UENUM()
enum class EnumName:uint8
{
	EONE,
	ETWO,
	ETHREE
}
UEnum* EnumPtr = FindObject<UEnum>((UObject*)ANY_PACKAGE,*FString("EnumName"),true);
Debug(EnumPtr->GetEnumName((int32)1));
3、动态生成蓝图实例

点击蓝图,然后Ctrl+C可以获取到蓝图路径

	UBlueprint *RefActorBP = LoadObject<UBlueprint>(NULL, TEXT("Blueprint'/Game/NewBlueprint.NewBlueprint''"));
	TSubclassOf<AActor> RefActorClass = (UClass*)RefActorBP->GeneratedClass;
	GetWorld()->SpawnActor<AActor>(RefActorClass, FVector::ZeroVector + FVector(0.f, 0.f, 60.f), FRotator::ZeroRotator);

在这里插入图片描述

在这里插入图片描述

修改时间:2019/9/25

注意:以上方法编辑器下可正常运行,但打包时会报错

正确的方案:

主要流程:TSoftClassPtr
  • 使用TSoftClassPtr获取资源UClass的软指针。
  • 通过TSoftClassPtr下的ToSoftObjectPath()方法获取FSoftObjectPath类型的资源路径
  • 使用FStreamableManager的异步加载进行加载
  • 通过句柄获取加载后的资源
  • 将资源强制转换未UClass
在.h文件中声明必要参数
public:
	//当资源加载完全后将其显示出来
	void LoadWealthCompleted();
public:
	//资源的软引用
	UPROPERTY(EditAnywhere)
		TArray<TSoftClassPtr<UObject>> ClassWealthPaths;
protected:
	//加载句柄
	TSharedPtr<FStreamableHandle> WealthHandle;

	//加载流
	FStreamableManager WealthLoader;
	
	//加载出来的Actors
	TArray<AActor*> WealthActors;
在.cpp文件中实现
// Called when the game starts or when spawned
void AAsyncLoadUClassActor::BeginPlay()
{
	Super::BeginPlay();

	// TODO: 将TSoftClassPtr的数组转换为FSoftObjectPath类型
	TArray<FSoftObjectPath> ObjectPaths;
	for (int i=0;i<ClassWealthPaths.Num();++i)
	{
		ObjectPaths.Push(ClassWealthPaths[i].ToSoftObjectPath());
	}
	//进行异步加载
	WealthHandle = WealthLoader.RequestAsyncLoad(ObjectPaths, 
		FStreamableDelegate::CreateUObject(this,&AAsyncLoadUClassActor::LoadWealthCompleted)
	);
}

void AAsyncLoadUClassActor::LoadWealthCompleted()
{
	//获取所有的UClass
	TArray<UObject*> WealthObjects;
	WealthHandle->GetLoadedAssets(WealthObjects);
	//创建实例,如果不是Actor的话
	//UObject: NewObject
	//UUserWidget: CreateWidget
	for (int i = 0; i < WealthObjects.Num(); ++i)
	{
		UClass *WealthClass = Cast<UClass>(WealthObjects[i]);

		AActor *WealthActor = GetWorld()->SpawnActor<AActor>(WealthClass, FVector(0.f, 0.f+i*100.0f, 100.f), FQuat::Identity.Rotator());
		WealthActors.Push(WealthActor);
	}
}
创建加粗样式几个StaticMeshActor测试

在这里插入图片描述

创建AsyncLoadClass蓝图并填入Actor参数

在这里插入图片描述

运行结果

在这里插入图片描述

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值