UEC++ 资源加载(二)间接属性引用
FSoftObjectPath
- FSoftObjectPath是一个简单的结构体,使用一个字符串包含资源的完整名称。可以在编辑器中拾取资源(这与直接属性引用相同),但是并不加载资源!资源的加载需要通过额外的代码编写完成!
- FSoftObjectPath被暴露到面板中对于资源的拾取并没有特定的要求,所有能够被序列化的资源均能被拾取(类资源,非类资源)
在头文件中声明一个FSoftObjectPath变量,暴露到蓝图中,在蓝图中指定资源路径
UPROPERTY(EditAnywhere)
FSoftObjectPath SourcePath;
资源加载
FSoftObjectPath只是存储了资源的路径,使用前必须通过加载方式方可获得资源!加载方式分为同步加载(如果资源过大会导致游戏程序卡顿)和异步加载
- 同步加载
- 在加载运行线程中,阻塞线程的流程执行,将线程停止在当前加载逻辑中,加载完成后继续线程的执行逻辑操作,对于加载小资源可以保证资源的不为空,但是加载大资源将导致调用线程卡顿
- 异步加载
- 在加载线程中,不阻塞当前线程逻辑加载资源,加载器本身具备线程进行资源加载。较之同步加载更加的灵活,但是相对维护成本较高,资源加载成功后需要进行回调通知,以完成整个加载流程
加载资产
// 直接引用资源 替代蓝图获取 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("加载成功!")); }
加载类:
SourcePath.SetPath(TEXT("Blueprint'/Game/MyTestActor.MyTestActor_C'")); UObject* Sorce = SourcePath.TryLoad(); UClass* myActor = Cast<UClass>(Sorce); if (myActor) { GetWorld()->SpawnActor<ATestActor>(myActor); }
注:这里的加载都是同步加载