静态加载指的是必须在构造函数中完成的加载方式,动态加载值得是可以在Runtime期间加载的方式。
巨坑提示:
加载Class的路径问题,一定要在路径后面加_C,否在会报错;或者把前缀后缀都去掉只留纯路径。
一、静态加载
静态加载:ConstructorHelpers::FClassFinder()和FObjectFinder()。
FObjectFinder()用来加载非蓝图资源,比如网格体、动画、贴图、音效等资源;
FClassFinder()用来加载蓝图并获取蓝图Class,比如角色蓝图。
代码演示:
加载资源:
static ConstructorHelpers::FObjectFinder<UStaticMesh> SphereAsset(TEXT("/Game/StarterContent/Shapes/Shape_Sphere.Shape_Sphere"));
加载蓝图Class:
static ConstructorHelpers::FClassFinder<AActor> UnitSelector(TEXT("Blueprint'/Game/MyProject/MyBlueprint.MyBlueprint_C'")); TSubclassOf<AActor> UnitSelectorClass = UnitSelector.Class;
static ConstructorHelpers::FClassFinder<AActor> UnitSelector(TEXT("Game/MyProject/MyBlueprint"));
TSubclassOf<AActor> UnitSelectorClass = UnitSelector.Class;
两种路径方式。
二、动态加载
LoadObject<T>()用来加载非蓝图资源,比如网格体、动画、贴图、音效等资源;
LoadClass<T>()用来加载蓝图并获取蓝图Class,比如角色蓝图。如果要用蓝图创建对象,必须先通过LoadClass获取class,然后再通过SpawnActor生成对象。
注意事项:
LoadClass<T>的模版名称,不能直接写UBlueprint,例如:LoadClass<UBlueprint>是错误的,创建蓝图时选择的是什么父类,则写对应的父类名,假如是Actor,那么要写成:LoadClass<AActor>,否则无法加载成功。
代码演示:
加载资源:
UObject* Obj = LoadObject<UObject>(NULL, TEXT("SkeletalMesh'/Game/MyMesh.MyMesh'"));
USkeletalMesh* MyMesh = Cast<USkeletalMesh*>(Obj);
UTexture2D* Tex = LoadObject<UTexture2D>(NULL, TEXT("Texture2D'/Game/Textures/UI/tex_test001.tex_test001'"));
加载Class:
TSubclassOf<AActor> UnitSelector = LoadClass<AActor>(NULL, TEXT("Blueprint'/Game/MyProject/MyBlueprint.MyBlueprint_C'"));
TSubclassOf<AActor> UnitSelector = LoadClass<AActor>(NULL, TEXT("Game/MyProject/MyBlueprint"));