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);
}
}