虚幻引擎中各种类型的废弃(Deprecate)标记语法

文章字数:915

简介

随着项目的发展,可能会发现需要重构一些逻辑。对于C++相对还是比较容易的,目前主流的IDE都提供了一定的重构能力,可以比较方便地进行重命名、查找引用等操作。

然后对于蓝图来说,可能就不太好直接一键操作了,直接改变老的逻辑有可能产生很多问题。尤其是对于已经有了大量引用地逻辑,如果直接改动可能产生预期之外的工作量。这个时候一个选择是做一个新版的实现,然后逐步废弃老的实现。为了优雅地实现这一目的,虚幻引擎提供了一些用于标记废弃的语法。

如果项目中应用了额外的脚本语言,需要参考对应实现来选择一个重构方式。

推荐使用Puerts作为一个类型安全的脚本语言,也许可以参考这篇文章:虚幻引擎适用于Unlua转到PuerTS的一些知识

重定向

如果是需要重命名,可以优先考虑使用UE的重定向系统:虚幻引擎中重定向的相关知识

废弃标记

UP­ROP­ER­TY

对于一个属性来说,只需要将变量重命名为_DEPRECATED版本,并且附加上废弃标识即可。

这不会影响到原有蓝图的编译,可以在此期间删除引用。

1
2
UPROPERTY(EditAnywhere)
int32 Value;
1
2
UPROPERTY(meta=(DeprecatedProperty, DeprecationMessage="Use NewValue instead."))
int32 Value_DEPRECATED;

UFUNC­TION

对于UFUNC­TION比较简单,给函数添加上meta属性DeprecatedFunction即可。

1
2
3
4
UPROPERTY(BlueprintPure)
int GetValue() const {
    return 0;
}
1
2
3
4
UPROPERTY(BlueprintPure, meta=(DeprecatedFunction, DeprecationMessage="Use GetNewValue() instead."))
int GetValue() const {
    return 0;
}

UCLASS

对于UCLASS来说,也需要进行重命名。

1
2
3
4
UCLASS()
class UTestObject : public UObject {
    GENERATED_BODY()
};
1
2
3
4
UCLASS(Deprecated)
class UDEPRECATED_TestObject : public UObject {
    GENERATED_BODY()
};

UENUM & USTRUCT

似乎并不支持上述DEPRECATED_的语法来影响蓝图编译,不过对于C++似乎引擎存在标记UE_DEPRECATED的语法。

更推荐改个已废弃的名,然后使用重定向系统来处理:虚幻引擎中重定向的相关知识

UE_DEPRECATED

可能是最为常见的一个废弃标记,通常用于标记函数或者变量在某个引擎版本后已被废弃了。

语法为UE_DEPRECATED(引擎版本号, 提示消息),当在被废弃的版本之后的C++中,使用被废弃的变量或函数时,编译器和IDE会给出提示。

自定义废弃宏

由于虚幻引擎的UE_DEPRECATED是否废弃与引擎版本有关,在平常的项目里可能不太方便,因此可以自己封装一个废弃宏。

1
2
3
4
#define META_DEPRECATED(...) [[deprecated(__VA_ARGS__ " This code has been marked as deprecated and may be deleted in subsequent versions. Please refer to the latest documentation for reference logic upgrade.")]]

#define META_DEPRECATED_DISABLE() META_WARNING_DISABLE(4996)
#define META_DEPRECATED_ENABLE() META_WARNING_ENABLE()

参考文章

加载中...