FSoftObjectPath

  • FSoftObjectPath是一个简单的结构体,使用一个字符串包含资源的完整名称。可以在编辑器中拾取资源(这与直接属性引用相同),但是并不加载资源!资源的加载需要通过额外的代码编写完成!
  • FSoftObjectPath被暴露到面板中对于资源的拾取并没有特定的要求,所有能够被序列化的资源均能被拾取(类资源,非类资源)
    在头文件中声明一个FSoftObjectPath变量,暴露到蓝图中,在蓝图中指定资源路径
1
2
UPROPERTY(EditAnywhere)
FSoftObjectPath SourcePath;

资源加载

FSoftObjectPath只是存储了资源的路径,使用前必须通过加载方式方可获得资源!加载方式分为同步加载(如果资源过大会导致游戏程序卡顿)和异步加载

  • 同步加载
    在加载运行线程中,阻塞线程的流程执行,将线程停止在当前加载逻辑中,加载完成后继续线程的执行逻辑操作,对于加载小资源可以保证资源的不为空,但是加载大资源将导致调用线程卡顿
  • 异步加载
    在加载线程中,不阻塞当前线程逻辑加载资源,加载器本身具备线程进行资源加载。较之同步加载更加的灵活,但是相对维护成本较高,资源加载成功后需要进行回调通知,以完成整个加载流程

加载资产

1
2
3
4
5
6
7
8
// 直接引用资源 替代蓝图获取
SourcePath.SetPath(TEXT("StaticMesh'/Game/ThirdPerson/Meshes/Bump_StaticMesh.Bump_StaticMesh'"));
// 尝试加载 同步加载
UObject* Source = SourcePath.TryLoad();
UStaticMesh* Mesh = Cast<UStaticMesh>(Source);
if (Mesh) {
UKismetSystemLibrary::PrintString(this, TEXT("加载成功!"));
}

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

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

加载类:

1
2
3
4
5
6
SourcePath.SetPath(TEXT("Blueprint'/Game/MyTestActor.MyTestActor_C'"));
UObject* Sorce = SourcePath.TryLoad();
UClass* myActor = Cast<UClass>(Sorce);
if (myActor) {
GetWorld()->SpawnActor<ATestActor>(myActor);
}

注:这里的加载都是同步加载