1、编辑器直接加载:

通过使用属性宏标记UPROPERTY(Edit三个都可以3)来将资产对象指针暴露到编辑器面板,从而直接从编辑器面板拾取资产。

注意:UClass类指针,专门用来拾取类模版资产

1
2
3
4
5
6
// 拾取任意类
UPROPERTY(EditDefaultsOnly)
UClass* ActorClass;
// 拾取音频类
UPROPERTY(EditDefaultsOnly)
class USoundBase* SoundSrc;

2、TSubClassOf

TSubclassOf是提供UClass的安全模板类,通过此模板类我们可以快速在编辑器中进行类型选择,帮助我们快速构建某种类型对象数据。
TS对类型有约束,只能选取模版类型或是继承自模版类型的类或是蓝图
使用语法:

1
2
TSubclassOf<T> type;
type.Get();// 获取到Class数据对象

通过通过TSubClassOf构建指定的对象类型

1
2
3
4
5
6
// 拾取任意类
UPROPERTY(EditDefaultsOnly)
UClass* ActorClass;
// 拾取指定的TestActor类或其子类
UPROPERTY(EditDefaultsOnly)
TSubclassOf<class ATestActor> TestActorclass;

3、构造函数加载

  • 在构造函数中可以借助构造函数资产加载类进行资源引用,更加方便便捷。

  • 静态资源引用类ConstructorHelpers可以进行类引用,源资源引用,注意ConstructorHelpers只能在构造函数中使用
    常用资源加入分类

  • FClassFinder 常用来加载创建后的蓝图对象

  • FObjectFinder 用来加载各种资源,如音频,图片,材质,静态网格

FClassFinder语法

1
2
3
4
// 返回值是TSubClassOf
ConstructorHelpers::FClassFinder<ATestActor>(TEXT("/Game/MyTestActor.MyTestActor")).Class;
// 拾取蓝图对象类 拾取蓝图类 必须加 '_C'
ConstructorHelpers::FClassFinder<ATestActor> UnitSelector(TEXT("Blueprint'/Game/MyTestActor.MyTestActor_C'"));

FObjectFinder语法

1
2
3
UTexture2D* BarFillTure;
ConstructorHelpers::FObjectFinder<UTexture2D> BarFillObj(TEXT("/Game/UI/HUD/BarFill"));
BarFillTure = BarFillObj.Object;

注意:

  • 操作路径前加入/Game/前缀
  • ConstructorHelpers 类将尝试在内存中查找该资产,如果找不到,则进行加载
  • ConstructorHelpers只能在构造函数中使用,GameInstance中是 Init 函数(需要重载)
  • 如果加载失败或是未找到资源,对象内的资产属性为null
  • 如果加载蓝图类模版对象时,需要加注“_C”
    查找加载

在只知道目标资源路径的基础上,进行运行时态的资源加载,UE提供了LoadObject用来加载资产,LoadClass用来加载类,通过模版约束对象类型,增加操作安全,但是注意,资源加载可能会失败或是无效,需要对操作的结果进行判定。

  • LoadObject 可直接返回资源有效对象指针
  • LoadClass 返回操作类,非对象返回UClass类型指针
    函数定义:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/** 
* Load an object.
* @see StaticLoadObject()
*/
template< class T >
inline T* LoadObject( UObject* Outer, const TCHAR* Name, const TCHAR* Filename=nullptr, uint32 LoadFlags=LOAD_None, UPackageMap* Sandbox=nullptr )
{
return (T*)StaticLoadObject( T::StaticClass(), Outer, Name, Filename, LoadFlags, Sandbox );
}

/**
* Load a class object
* @see StaticLoadClass
*/
template< class T >
inline UClass* LoadClass( UObject* Outer, const TCHAR* Name, const TCHAR* Filename=nullptr, uint32 LoadFlags=LOAD_None, UPackageMap* Sandbox=nullptr )
{
return StaticLoadClass( T::StaticClass(), Outer, Name, Filename, LoadFlags, Sandbox );
}

参数含义:

  • Outer 帮助我们进行搜索范围锁定,可以填入同目录资源,如不存在填入空
  • Name 资源文件名,可以在编辑器中通过选择资源右键获取引用名,注意蓝图加载需要加入后缀”_C”
    函数使用:
1
LoadObject<AActor>(nullptr, TEXT("Blueprint'/Game/MyTestActor.MyTestActor_C'"));