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);
    }

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

posted @ 2022-09-21 14:10  黎沐不吃香菜  阅读(252)  评论(1编辑  收藏  举报