记录点之前没记过的UE C++奇技淫巧4

最后更新于 2025-02-07 495 次阅读


类型对应Getter

InputActionValue这个类中,使用模板Get处理不同类型的特化Get

template<>
inline bool FInputActionValue::Get() const 
{ return IsNonZero(); }

template<>
inline FInputActionValue::Axis1D FInputActionValue::Get() const 
{ return Value.X; }

template<>
inline FInputActionValue::Axis2D FInputActionValue::Get() const 
{ return Axis2D(Value.X, Value.Y); }

template<>
inline FInputActionValue::Axis3D FInputActionValue::Get() const 
{ return Value; }

这样在想获取一个类型对应的Get的时候就可以用模板来实现,如

SetDesiredGait(ActionValue.Get<bool>() ? A : B);

弧度之间的近似判断

if(constexpr float AngleTolerance = 1e-3f, !FMath::IsNearlyEqual(CurrentRotation.Yaw, DesiredRotation.Yaw, AngleTolerance)

1e-3f 是一个较小的值,表示允许的角度误差范围。在大多数情况下,这个精度已经足够满足游戏或图形应用中对旋转角度的判断需求。如果两个角度的差值小于 1e-3f,则认为它们是“几乎相等”的。

浮点数计算存在精度限制,直接比较两个浮点数是否完全相等通常是不安全的。使用一个小的容差值(如 1e-3f)可以避免因浮点数精度问题导致的误判。1e-3f 是一个在性能和准确性之间取得平衡的常用值。

缺少导出宏导致在项目无法链接到插件中的函数

如果在项目中引用插件中的类,结构体,但不能使用这个类中的函数,编译时会提示无法链接,则有可能是缺少导出宏。

  1. 导出和导入符号
    • 当一个模块(例如一个插件或游戏模块)定义了一个类或函数,并且希望其他模块能够使用它时,需要使用这个宏来标记该类或函数为“导出”。
    • 当其他模块使用这个类或函数时,需要使用这个宏来标记为“导入”。
  2. 跨模块边界
    • 在Windows平台上,DLL(动态链接库)需要明确指定哪些符号(类、函数、变量)是导出的(供其他模块使用),哪些是导入的(从其他模块使用)。这个宏帮助编译器正确处理这些符号。
  3. 平台兼容性
    • 这个宏在不同平台上有不同的定义。例如,在Windows上,它可能会扩展为 __declspec(dllexport) 或 __declspec(dllimport),而在其他平台上(如Linux或Mac),它可能什么都不做(因为不需要显式导出/导入符号)。