Unreal资源引用(一)

    Unreal Engine4提供了多种机制,用来控制资源引用并加载到内存中。资源引用有两种方式:直接引用(Hard Reference)指A引用B,当加载A时会自动加载B;间接引用(Soft Reference)指A通过一种间接机制引用B,如B的路径字符串。这篇博客简述直接引用。

    直接属性引用

    这是最常见的资源引用方式,通过UPROPERTY宏暴露给开发者。CPP类通过UPROPERTY定义属性,之后设计师既可以在蓝图子类中指定对应类型的资源,也可以直接拖动到场景中指定资源。例如,下面的代码是从StrategyGame案例中截取的,可以让设计师选择建筑物崩塌时播放的声音。

/** construction start sound stinger */

UPROPERTY(EditDefaultsOnly, Category=Building)

USoundCue* ConstructionStartStinger;

    该属性只能作为当前物体默认属性来设置(EditDefaultOnly关键字控制)设计师创建了一个基于AStrategyBuilding的蓝图子类,指定声音属性后将随蓝图一起保存。当加载蓝图对象时,该对象引用的声音资源将作为其UPROPERTY属性的一部分自动加载。

    构造时引用

    第二种直接引用为构造时引用,即程序猿知道某一个属性具体需要引用的资源并在构造函数中设置该属性。该方法借助一个特殊的类 ConstructorHelpers 查找对应的资源和类,一般在构造函数中完成。接下来还是StrategyGame案例中截取的代码片段,为HUD类中赋资源的方式。
/** gray health bar texture */

UPROPERTY()

class UTexture2D* BarFillTexture;

AStrategyHUD::AStrategyHUD(const FObjectInitializer& ObjectInitializer) :
    Super(ObjectInitializer)
{
    static ConstructorHelpers::FObjectFinder<UTexture2D> BarFillObj(TEXT("/Game/UI/HUD/BarFill"));

    ...

    BarFillTexture = BarFillObj.Object;
    上面的构造方法中,ConstructorHelpers类试图在内存中找到资源,如果找不到则从硬盘加载。参数中的完整路径用来指定加载什么资源。如果该资源不存在或者由于某些错误不能被加载,则该属性会被设置为空指针(nullptr)。这样的话,代码试图获取这个贴图资源时程序会崩溃。所以最好的做法是确保该资源不为空。
    UPROPERTY属性的声明和前面直接引用的案例功能一致,唯一的区别在于初始化。我们需要明确一点的是,当资源加载和创建时,对应的引用资源也会被加载到内存中。这个需要就需要格外小心,否则可能会因为一次性加载太多资源导致内存炸掉。如果你想延时加载或者运行时才决定加载哪些资源,请查看下一篇博客。


你可能感兴趣的:(Engine,Unreal,Unreal)