首页 > 编程语言 >UEC++ 资源加载(一)直接属性引用

UEC++ 资源加载(一)直接属性引用

时间:2022-09-21 13:11:59浏览次数:70  
标签:UClass 拾取 MyTestActor C++ UE ConstructorHelpers 资源 加载

1、编辑器直接加载:

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

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

    // 拾取任意类
    UPROPERTY(EditDefaultsOnly)
        UClass* ActorClass;
    // 拾取音频类
    UPROPERTY(EditDefaultsOnly)
        class USoundBase* SoundSrc;

2、TSubClassOf

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

使用语法:

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

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

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

3、构造函数加载

  • 在构造函数中可以借助构造函数资产加载类进行资源引用,更加方便便捷。
  • 静态资源引用类ConstructorHelpers可以进行类引用,源资源引用,注意ConstructorHelpers只能在构造函数中使用

常用资源加入分类

  • FClassFinder 常用来加载创建后的蓝图对象
  • FObjectFinder 用来加载各种资源,如音频,图片,材质,静态网格

FClassFinder语法

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

FObjectFinder语法

    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类型指针

函数定义:

/** 
 * 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”

函数使用:

    LoadObject<AActor>(nullptr, TEXT("Blueprint'/Game/MyTestActor.MyTestActor_C'"));

 

标签:UClass,拾取,MyTestActor,C++,UE,ConstructorHelpers,资源,加载
From: https://www.cnblogs.com/limu-zy/p/16710915.html

相关文章