Appearance
资源加载
虚幻中的资源分为类资源和非类资源。资产加载到内存中,我们操作时需要通过引用来完成。引用又分两种:硬性引用和软引用。
- 硬性引用,A对象引用B对象,导致B在A加载时就加载了
- 软引用,A对象通过间接机制(例如字符串形式的对象路径)来引用B对象
可以用类指针拾取类模板资产。如:
UCLASS加载
cpp
UPROPERTY(EditDefaultsOnly)
UClass* BallActorClass; // 专门用来拾取类资产
UPROPERTY(EditDefaultsOnly)
class USoundCue* SoundSrc; // 获取音频资产
TSubclassOf
这是提供给UClass的安全模板类,通过此模板类我们可以快速在编辑器中进行类型选择,帮助我们快速构建某种类型对象数据。(表现为搜索的时候可选项变少,更加精简)
TS对类型有约束,只能选取模板类型或是继承自模板类型的类或是蓝图
cpp
// TSubclassOf<T> type;
// type.Get(); // 获取UClass数据对象
// 构建指定类的对象
UPROPERTY(EditDefaultsOnly)
UClass* BallActorClass; // 用来拾取任意类资产
UPROPERTY(EditDefaultsOnly)
TSubclassOf<AMyActor> MyActorClass; // 只能用来拾取AMyActor类或是其子类
构造函数加载
当蓝图创建的时候就加载,不用等到在场景中实例化再加载。
静态资源引用类ConstructorHelpers可以进行类引用,源资源引用,注意ConstructorHelpers只能在构造函数中使用
常用资源加入分类
FClassFinder 常用来加载创建后的蓝图对象
FObjectFinder 加载各种资源,如音频、图片、材质、静态网格
cpp
// FClassFinder语法
// 如下,返回数据类型是TSubClassof
ConstructorHelpers::FClassFinder<APawn>(TEXT("资源类型'资源路径'").Class);
// 也可以使用路径拾取蓝图对象。其中_C必加
ConstructorHelpers::FClassFinder<AActor> UnitSelector(TEXT("Blueprint'路径_C'"));
UnitSelector = UnitSelector.Class;
// =================
// FObjectFinder语法
ConstructorHelpers::FObjectFinder<UTexture2D> BarFillObj(TEXT("资源类型'路径'"));
BarFillTexture = BarFillObj.Object; // 将获取的数据内容指针保存
注意 1、操作路径前要加入/Game/前缀 2、ConstructorHelpers类将尝试在内存中查找资产,找不到则进行加载 3、ConstructorHelpers只能在构造函数中使用 4、如果加载失败或是未找到资源,对象内的资产属性为null 5、如果加载蓝图类模板对象时,需要在末尾加"_C"
查找加载
仅知道路径的情况下,可以用两个方法加载资源:LoadObject,LoadClass。其中,LoadObject加载资产,LoadClass加载类。
LoadObject 可直接返回资源有效对象指针
LoadClass 返回操作类,非对象返回UClass类型指针
cpp
Sound = LoadObject<USoundCue>(nullptr, TEXT("SoundCue'路径'"));
ActorClass = LoadClass<AActor>(nullptr, TEXT("Blueprint'路径_C'"));
if(Sound)
{
UGameplayStatics::PlaySound2D(GetWorld(), Sound);
}
if(ActorClass)
{
GetWorld()->SpawnActor(SubActorClass); // UClass里有带参构造,参数类型为TSubclassof
}