【UE5随笔】02_宏和说明符

1. 属性 UPROPERTY

UPROPERTY 宏用于自动化属性的序列化、编辑器可见性和内存管理。

UPROPERTY(<Specifiers01>, <Specifiers02>)

1. 访问权限说明符

说明符 含 义
VisibleAnywhere 在属性窗口中只读。
VisibleInstanceOnly 仅在实例中可见。
VisibleDefaultsOnly 仅在默认属性窗口中可见。
EditAnywhere 可在属性窗口中编辑。
EditInstanceOnly 仅在实例中可编辑。
EditDefaultsOnly 仅在类默认对象(CDO)中可编辑。

2. 配置和保存说明符

说明符 含 义
BlueprintReadOnly 在蓝图中只读。
BlueprintReadWrite 在蓝图中可读写。
Config 从配置文件加载/保存。
GlobalConfig 在全局配置文件中保存。

3. 分类和标签说明符

说明符 含 义
Category="CategoryName" 属性的分类。
Meta=(ToolTip="Your Tooltip Text") 提供工具提示。

4. 内存管理说明符

说明符 含 义
Transient 不在保存游戏状态时序列化。
DuplicateTransient 复制操作时不复制。

5. 网络相关说明符

说明符 含 义
Replicated 在网络游戏中复制此属性。
ReplicatedUsing=FunctionName 设置复制此属性时调用的函数。

6. 扩展说明符

说明符 含 义
meta=(ExposeOnSpawn="ExposeOnSpawnValue") 该属性将在对象(通常是一个Actor或其组件)被创建或生成时在编辑器中暴露出来,使其可以在生成时进行设置。

2. 方法 UFUNCTION

UFUNCTION 宏用于标记函数,使其可以与引擎的各种系统(如蓝图、网络系统等)交云。

UFUNCTION(
<think>嗯,用户这次问的是UEUE_KINDA_SMALL_NUMBER的作用,看来是在进行Unreal Engine开发时遇到了浮点数精度处理的问题。从用户引用的两条日志动画更新代码片段来看,ta应该是在调试角色移动或动画系统,可能需要处理微小数值比较的场景。 用户提供的两个引用其实当前问题关联不大:引用[1]是角色移动组件的步进调试日志,引用[2]描述的是蒙太奇动画更新机制。不过这些线索暗示用户可能在开发角色动作系统,这个对ta解决骨骼变换或碰撞检测的边界条件应该很有用。 关于UE_KINDA_SMALL_NUMBER这个,核心要解释清楚三点:首先是它的设计意图,用于解决浮点数精度误差导致的误判;其次要说明具体阈值1e-4的选择依据;最后需要强调与引擎其他容差(如SMALL_NUMBER)的对比。用户作为开发者,肯定关心实际应用场景,要重点列举动画混合、碰撞检测等典型案例。 突然想到用户之前问过"靶向移动"这种偏理论的概念,现在转向具体引擎的使用,说明ta可能是科研向的游戏开发者。在解释时可以适当关联数值稳定性这类计算机科学概念,但要以UE4/UE5的实际代码示例为主。ta的引用显示熟悉C++日志系统,示例代码应该用C++而不用蓝图。 需要特别注意数学表达规范:所有公式必须用$...$包裹,比如比较运算要写成$ |a-b| < \epsilon $。虽然这个问题不涉及复杂公式,但浮点误差的数学解释可以用$ \epsilon = 10^{-4} $这样的表达。 用户可能还想知道如何自定义这个阈值,或者在不同平台(移动端/PC)是否需要调整。虽然ta没直接问,但在回答里暗示下"可配置性"会很有帮助。毕竟NS平台的浮点精度就PC不一样。 </think> `UE_KINDA_SMALL_NUMBER` 是 Unreal Engine 中用于**浮点数容差判断**的关键,主要解决浮点数精度误差导致的比较问题。其核心作用与典型用法如下: --- ### **1. 定义与数值** 在引擎源码中定义为: ```cpp #define UE_KINDA_SMALL_NUMBER (1.e-4f) // 单精度浮点数的容差阈值 ``` 即设定一个极小值 $ \epsilon = 10^{-4} $,作为浮点数比较时的误差允许范围。 --- ### **2. 核心作用** 用于避免**浮点数精度误差**引发的逻辑错误: - **场景示例**: 理论上 `float A = 0.0f`, `float B = 计算值`,预期 `B == 0`,但因浮点运算误差,实际 `B = 1e-6f`(接近0但非零)。 - **错误比较**:`if (B == 0.0f)` 会失败。 - **正确比较**:`if (FMath::Abs(B) < UE_KINDA_SMALL_NUMBER)` 成立。 --- ### **3. 典型应用场景** #### **(1) 向量近似判断** ```cpp FVector Vec = GetVelocity(); // 判断向量是否接近零向量 if (Vec.SizeSquared() < UE_KINDA_SMALL_NUMBER) { // 执行停止逻辑 } ``` #### **(2) 动画权重更新** 在动画蒙太奇更新中,避免无效计算[^2]: ```cpp float Weight = Montage.GetWeight(); if (Weight < UE_KINDA_SMALL_NUMBER) { // 跳过权重极低的蒙太奇更新,优化性能 return; } ``` #### **(3) 碰撞检测容差** 处理角色移动时,避免微小穿透导致的抖动[^1]: ```cpp // 判断碰撞法线是否近似垂直 if (FMath::Abs(Hit.Normal.Z) > (1.f - UE_KINDA_SMALL_NUMBER)) { // 处理地面碰撞 } ``` --- ### **4. 与其他容差对比** | 名 | 值 | 用途 | |-----------------------|-------------|--------------------------| | `UE_KINDA_SMALL_NUMBER` | $1 \times 10^{-4}$ | 通用场景(向量、旋转等) | | `SMALL_NUMBER` | $1 \times 10^{-8}$ | 更高精度需求 | | `THRESH_POINT_ON_PLANE` | $0.1$ | 平面点投影容差 | --- ### **5. 使用原则** - **非零判断**:用 `FMath::Abs(x) < UE_KINDA_SMALL_NUMBER` 替代 `x == 0` - **等价比较**:用 `FMath::IsNearlyEqual(a, b)` 替代 `a == b`(内部依赖此) - **避免累加误差**:连续浮点运算后必须用容差校验 > 📌 **关键提示**:在物理模拟、动画混合、碰撞检测等对数值敏感的场景中,忽略浮点精度误差会导致不可预测的Bug(如角色抖动、动画跳变)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值