AnimationBlueprintLibrary 模块全面系统分析
目录
### 文章目录
- [AnimationBlueprintLibrary 模块全面系统分析](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [目录](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [@toc](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [写在前面:为什么需要这个模块](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [模块概述](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [基本信息](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [模块依赖](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [模块整体架构解析](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [架构图](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [功能域划分](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分)](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [2. Notify与同步标记管理域](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [3. 曲线数据操作域](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose)](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [5. 属性(Attribute)操作域](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [数据流走向](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [模块设计亮点](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [类级代码注释详解](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [4.1 UAnimationBlueprintLibrary 类](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [概述](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [4.1.1 动画基本信息查询](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [4.1.2 压缩配置管理](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [4.1.3 叠加动画与插值配置](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [4.1.4 同步标记管理](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [4.1.5 Notify事件管理(重点)](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [4.1.6 曲线数据操作](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [4.1.7 AnimBlueprint操作](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [4.1.8 Timecode属性处理](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [4.2 FAnimPose 与 UAnimPoseExtensions](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [FAnimPose 数据结构](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [FAnimPoseEvaluationOptions](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [UAnimPoseExtensions 核心函数](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [4.3 UAnimationAttributeBlueprintLibrary](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [概述](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [CustomThunk机制解析](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [4.4 K2Node蓝图节点](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [功能使用示例编写](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [示例1:批量修改动画序列的压缩设置](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [示例2:用动画蓝图评估输入Pose(程序化IK验证)](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [示例3:批量替换Notify并保留所有元数据](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [示例4:在蓝图中用CustomThunk节点操作骨骼属性](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [核心技术栈与依赖分析](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [总结与最佳实践](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [核心要点](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [常见使用陷阱](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
- [模块的未来演进方向](#文章目录 AnimationBlueprintLibrary 模块全面系统分析 目录 @[toc] 写在前面:为什么需要这个模块 模块概述 基本信息 模块依赖 模块整体架构解析 架构图 功能域划分 1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分) 2. Notify与同步标记管理域 3. 曲线数据操作域 4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose) 5. 属性(Attribute)操作域 数据流走向 模块设计亮点 类级代码注释详解 4.1 UAnimationBlueprintLibrary 类 概述 4.1.1 动画基本信息查询 4.1.2 压缩配置管理 4.1.3 叠加动画与插值配置 4.1.4 同步标记管理 4.1.5 Notify事件管理(重点) 4.1.6 曲线数据操作 4.1.7 AnimBlueprint操作 4.1.8 Timecode属性处理 4.2 FAnimPose 与 UAnimPoseExtensions FAnimPose 数据结构 FAnimPoseEvaluationOptions UAnimPoseExtensions 核心函数 4.3 UAnimationAttributeBlueprintLibrary 概述 CustomThunk机制解析 4.4 K2Node蓝图节点 功能使用示例编写 示例1:批量修改动画序列的压缩设置 示例2:用动画蓝图评估输入Pose(程序化IK验证) 示例3:批量替换Notify并保留所有元数据 示例4:在蓝图中用CustomThunk节点操作骨骼属性 核心技术栈与依赖分析 总结与最佳实践 核心要点 常见使用陷阱 模块的未来演进方向)
写在前面:为什么需要这个模块
在UE5里做动画相关工作的时候,大家可能会碰到这样一些场景:
- 想在编辑器的Blueprint里对某个Animation Sequence做批量操作------替换所有Notify、批量修改曲线、增删骨骼轨道------结果发现根本没有对应的蓝图节点可用,只能手写C++工具类;
- 想做程序化动画处理,比如"给这个动画序列的第15帧插入一个带特定参数的AnimNotify",在蓝图里压根没有这样的接口;
- 想读取动画资产的MetaData、获取某个时间点的骨骼Pose数据、评估动画蓝图给定输入Pose后的输出------这些操作在蓝图里要么不支持,要么API散落在各个角落。
AnimationBlueprintLibrary 就是为解决这些问题而生的。
它不是引擎运行时的核心动画系统,而是一个编辑器辅助模块 ------它为上述所有操作提供了统一的、蓝图友好的静态函数接口。可以把它的定位理解为:UE动画资产操作管线的"蓝图桥接层" 。底层的UAnimSequence、UAnimDataModel、IAnimationDataController等类负责真正的数据读写和压缩,而AnimationBlueprintLibrary则把这些底层能力封装成一堆简单直接的UFUNCTION,让技术美术和蓝图脚本也能方便地调用。
模块的代码量不算特别大,总共有8个源文件(4个头文件 + 4个cpp文件),但涵盖的功能面非常广------从基础的帧/时间计算到复杂的Pose评估、从Notify增删改到AnimBlueprint资产覆盖。正因为这种"小而全"的特质,它也非常适合作为大家学习UE动画资产编辑管线的切入点。
模块概述
基本信息
| 属性 | 值 |
|---|---|
| 模块名称 | AnimationBlueprintLibrary |
| 类型 | Editor(编辑器模块) |
| 位置 | Engine/Source/Editor/AnimationBlueprintLibrary |
| 描述 | 为动画资产操作提供蓝图可调用的静态函数库,涵盖动画序列数据读写、Notify管理、曲线编辑、Pose评估、MetaData操作、Timecode属性处理等功能 |
整个模块包含8个核心源文件,功能组织如下:
| 文件 | 角色 |
|---|---|
AnimPose.h/cpp |
FAnimPose 数据结构 + UAnimPoseExtensions 姿态评估函数库 |
AnimationBlueprintLibrary.h/cpp |
UAnimationBlueprintLibrary 主体函数库,百余个动画操作API |
AnimationAttributeBlueprintLibrary.h/cpp |
UAnimationAttributeBlueprintLibrary 自定义Thunk实现属性键操作 |
K2_AnimationAttributeNodes.h/cpp |
属性操作的蓝图图节点封装(UK2Node_SetAttributeKeyGeneric等) |
模块依赖
在 AnimationBlueprintLibrary.build.cs 中定义了如下依赖:
私有依赖: Core, CoreUObject, TimeManagement
公开依赖: AnimGraph, Engine, BlueprintGraph, UnrealEd
几个关键依赖的作用:
- Engine :提供
UAnimSequence、UAnimSequenceBase、UAnimMontage等核心动画资产类型 - AnimGraph :提供
UAnimGraphNode_Base、UAnimationGraph等动画蓝图图节点类型(用于GetAnimationGraphs、GetNodesOfClass等API) - BlueprintGraph :提供
UK2Node_CallFunction,这是属性操作节点UK2Node_BaseAttributeActionNode的父类 - UnrealEd :编辑器依赖,因为这个模块本身就是编辑器专属,几乎所有函数都带
WITH_EDITOR性质
模块整体架构解析
架构图
如果直接看那上百个 UFUNCTION,可能会觉得眼花缭乱。但把它们按功能域分拆开后,模块的结构其实非常清晰:
┌───────────────────────────────────────────────────────────────────────────────┐
│ AnimationBlueprintLibrary 模块 │
├───────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────┐ ┌──────────────────────────────────┐ │
│ │ UAnimationBlueprintLibrary │ │ UAnimPoseExtensions │ │
│ │ (主体蓝图函数库) │ │ (Pose 评估与操作) │ │
│ │ │ │ │ │
│ │ ┌─ 动画基本信息 │ │ - GetAnimPoseAtTime/Frame │ │
│ │ │ (帧数/键数/长度/速率) │ │ - GetBonePose / SetBonePose │ │
│ │ ├─ 压缩设置 │ │ - GetRefBonePose │ │
│ │ │ (骨骼/曲线/帧剥离) │ │ - GetRelativeTransform │ │
│ │ ├─ 叠加动画 │ │ - GetSocketPose │ │
│ │ │ (Additive类型/基础姿态) │ │ - GetCurveWeight │ │
│ │ ├─ 插值与根运动 │ │ - EvaluateAnimBlueprintWithInput │ │
│ │ │ (Interpolation/RootMotion) │ │ - GetReferencePose │ │
│ │ ├─ 同步标记 │ │ │ │
│ │ │ (SyncMarker CRUD) │ │ + FAnimPose 数据结构 │ │
│ │ ├─ Notify事件 │ │ + FAnimPoseEvaluationOptions │ │
│ │ │ (Notify/NotifyState CRUD) │ └──────────────────────────────────┘ │
│ │ ├─ Notify轨道 │ │
│ │ │ (Track管理) │ ┌──────────────────────────────────┐ │
│ │ ├─ 曲线数据 │ │ UAnimationAttributeBlueprintLibrary│ │
│ │ │ (Float/Vector/Transform) │ │ (属性键操作 - CustomThunk) │ │
│ │ ├─ MetaData │ │ │ │
│ │ │ (元数据CRUD) │ │ - SetAttributeKey/Keys │ │
│ │ ├─ 骨骼轨道 │ │ - GetAttributeKey/Keys │ │
│ │ │ (RemoveBoneAnimation) │ │ │ │
│ │ ├─ 虚拟骨骼 │ │ 通过 exec* 函数实现泛型属性处理 │ │
│ │ │ (VirtualBone管理) │ └──────────────────────────────────┘ │
│ │ ├─ Timecode属性 │ │
│ │ │ (EvaluateRootBoneTimecode*) │ ┌──────────────────────────────────┐ │
│ │ ├─ AnimBlueprint操作 │ │ K2Node 蓝图图节点 │ │
│ │ │ (GetGraphs/GetNodes/ │ │ │ │
│ │ │ AddNodeAssetOverride) │ │ - UK2Node_SetAttributeKeyGeneric │ │
│ │ ├─ 工具函数 │ │ - UK2Node_SetAttributeKeysGeneric│ │
│ │ │ (Frame/Time互转等) │ │ - UK2Node_GetAttributeKeyGeneric │ │
│ │ └─ 已废弃API │ │ - UK2Node_GetAttributeKeysGeneric│ │
│ │ (RawTrack/GetBonePose*) │ │ │ │
│ └─────────────────────────────────┘ └──────────────────────────────────┘ │
│ │
└───────────────────────────────────────────────────────────────────────────────┘
功能域划分
按照职责可以把模块分成五大功能域:
1. 动画资产查询与编辑域(UAnimationBlueprintLibrary 主体部分)
这是模块中体量最大的部分,提供了对 UAnimSequence / UAnimSequenceBase / UAnimMontage 几乎所有可编辑属性的Get/Set操作。
- 基本信息 :
GetNumFrames、GetNumKeys、GetSequenceLength、GetRateScale/SetRateScale - 压缩配置 :
Get/SetBoneCompressionSettings、Get/SetCurveCompressionSettings、Get/SetVariableFrameStrippingSettings - 叠加动画 :
Get/SetAdditiveAnimationType、Get/SetAdditiveBasePoseType - 插值与根运动 :
Get/SetAnimationInterpolationType、IsRootMotionEnabled/SetRootMotionEnabled、Get/SetRootMotionLockType、IsRootMotionLockForced/SetIsRootMotionLockForced - 轨道查询 :
GetAnimationTrackNames、GetMontageSlotNames、GetAnimationCurveNames
2. Notify与同步标记管理域
这是整个模块中业务逻辑最密集的区域,涵盖了Animation Notify的完整生命周期:
- 同步标记 :
GetAnimationSyncMarkers、GetUniqueMarkerNames、AddAnimationSyncMarker、RemoveAnimationSyncMarkersByName/ByTrack、RemoveAllAnimationSyncMarkers - Notify事件 :
GetAnimationNotifyEvents、GetAnimationNotifyEventNames、AddAnimationNotifyEvent、AddAnimationNotifyStateEvent、AddAnimationNotifyEventObject、AddAnimationNotifyStateEventObject、RemoveAnimationNotifyEventsByName/ByTrack - Notify替换与复制 :
ReplaceAnimNotifies、ReplaceAnimNotifyStates、CopyAnimNotifiesFromSequence - Notify轨道 :
GetAnimationNotifyTrackNames、AddAnimationNotifyTrack、RemoveAnimationNotifyTrack、RemoveAllAnimationNotifyTracks、IsValidAnimNotifyTrackName - 工具函数 :
GetAnimNotifyEventTriggerTime、GetAnimNotifyEventDuration
值得注意的是,ReplaceAnimNotifies_Helper 这个内部函数展示了非常精细的Notify迁移逻辑------它不会简单地把旧Notify删了新建,而是完整保留了:TriggerTimeOffset、SlotIndex、SegmentIndex、LinkMethod、EndLink等所有元属性,确保替换后的Notify在时间线上的行为与原来完全一致。
3. 曲线数据操作域
针对三种标准曲线类型(Float / Vector / Transform)提供了对称的Add/Get接口:
- 曲线创建/删除 :
AddCurve、RemoveCurve、RemoveAllCurveData - 键操作 :
AddFloatCurveKey/Keys、AddVectorCurveKey/Keys、AddTransformationCurveKey/Keys - 键查询 :
GetFloatKeys、GetVectorKeys、GetTransformationKeys、GetFloatValueAtTime - 曲线存在性检查 :
DoesCurveExist
这套API内部通过模板函数 AddCurveKeysInternal 和 GetCurveKeysInternal 实现了类型安全的复用,底层最终通过 IAnimationDataController 接口写入(而非直接操作RawData),遵循了UE5动画数据管线的标准架构。
4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose)
这是UE5.2之后重点推广的新API体系,用于替代已废弃的旧 GetBonePosesForTime/Frame 系列函数:
- Pose生成 :
GetAnimPoseAtTime、GetAnimPoseAtFrame、GetReferencePose - 骨骼操作 :
GetBonePose、SetBonePose、GetRefBonePose、GetBoneNames - 相对变换 :
GetRelativeTransform、GetRelativeToRefPoseTransform、GetRefPoseRelativeTransform - Socket :
GetSocketNames、GetSocketPose - 曲线 :
GetCurveNames、GetCurveWeight - 动画蓝图评估 :
EvaluateAnimationBlueprintWithInputPose
FAnimPose 本身是一个USTRUCT,内部维护了多组平行数组:BoneNames、BoneIndices、ParentBoneIndices、LocalSpacePoses、WorldSpacePoses、RefLocalSpacePoses、RefWorldSpacePoses、CurveNames、CurveValues、SocketNames、SocketParentBoneNames、SocketTransforms。这种设计使得它在给定 FBoneContainer 初始化后,可以作为一个独立的"快照"来传递和处理,不再需要每次都回头查原始动画数据。
5. 属性(Attribute)操作域
这是模块中实现最特殊的部分------因为属性的值类型是泛型的(可以是 FFloatAnimationAttribute、FIntegerAnimationAttribute、FStringAnimationAttribute 等任意注册类型),无法直接用常规的 UFUNCTION 声明,所以采用了 CustomThunk 机制:
UAnimationAttributeBlueprintLibrary声明了带CustomThunk标记的接口函数,其蓝图暴露的参数类型是int32&占位符- 实际的类型解析在
exec*函数中完成------通过Stack.StepCompiledIn获取运行时传入的真实结构体类型 - 底层再转发到
Generic_*函数,通过IAnimationDataController/IAnimationDataModel接口完成真实的数据读写
四个 UK2Node_* 子类负责在蓝图编辑器层面约束引脚类型------IsConnectionDisallowed 会检查连接的结构体是否已通过 UE::Anim::AttributeTypes::IsTypeRegistered 注册,并拒绝 UUserDefinedStruct 类型。
数据流走向
以"向动画序列添加一个Notify"为例,展示模块内典型的数据流:
1. 蓝图调用 UAnimationBlueprintLibrary::AddAnimationNotifyEvent(Sequence, TrackName, StartTime, NotifyClass)
↓
2. 参数校验:IsValidAnimNotifyTrackName() 检查轨道名有效
IsValidTimeInternal() 检查时间在序列长度内
↓
3. 创建新事件:FAnimNotifyEvent& NewEvent = Sequence->Notifies.AddDefaulted_GetRef()
↓
4. 填充字段:NewEvent.Link(Sequence, StartTime) --- 计算TriggerTimeOffset等
NewEvent.TrackIndex = GetTrackIndexForAnimationNotifyTrackName(...)
NewEvent.Notify = NewObject<UAnimNotify>(Sequence, NotifyClass, ...)
NewEvent.NotifyName = FName(*NewEvent.Notify->GetNotifyName())
↓
5. 刷新缓存:AnimationSequenceBase->RefreshCacheData()
↓
6. 返回创建的 UAnimNotify* 给调用方
曲线键添加的流程稍有不同,因为它通过 IAnimationDataController 接口写入:
1. 蓝图调用 AddFloatCurveKey(Sequence, CurveName, Time, Value)
↓
2. 内部转发至模板: AddCurveKeysInternal<float, FFloatCurve, RCT_Float>(...)
↓
3. 从 DataModel 查找曲线: FindCurve(FAnimationCurveIdentifier(CurveName, RCT_Float))
↓
4. 获取 Controller: AnimationSequenceBase->GetController()
↓
5. 写入键: Controller.SetCurveKey(CurveId, { Time, Value })
模块设计亮点
-
统一的"操作→刷新缓存"模式 :几乎所有写操作最后都调用了
RefreshCacheData()或RefreshSyncMarkerDataFromAuthored(),保证了动画资产内部缓存的一致性,这是很多自研工具容易忽略的细节。 -
CustomThunk的创造性使用 :
UAnimationAttributeBlueprintLibrary对泛型属性类型的处理方式是一个很好的 CustomThunk 教材------占位符声明、运行时类型解析、分离的Generic_*逻辑层,三层配合实现了蓝图侧的灵活类型支持。 -
完整的参数校验体系:每个操作函数都有一层格式化的参数验证(时间范围、轨道名存在性、骨骼名存在性、Outer正确性等),并有对应的Warning/Error日志输出,这在自动化管线(如Python脚本批量处理动画资产)中至关重要。
-
向前兼容的废弃标记 :对已迁移到
IAnimationDataModel/FAnimPose的旧API(如GetRawTrackPositionData、GetBonePosesForTime),都标记了UE_DEPRECATED并提供明确的替代方案说明。
类级代码注释详解
4.1 UAnimationBlueprintLibrary 类
概述
UAnimationBlueprintLibrary 是整个模块的核心类,继承自 UBlueprintFunctionLibrary,提供了一百多个静态函数用于动画资产的查询和编辑。
核心设计理念:
- 纯静态函数 :所有函数都是
static,无需实例化,直接通过蓝图节点或C++调用 - 参数校验优先:每个函数都对输入参数做了充分的null检查和有效性验证
- 读写分离:Get函数接收const指针,Set函数接收非const指针,语义清晰
- 通过Controller写入 :曲线和骨骼轨道的修改统一走
IAnimationDataController,不直接操作底层RawData
4.1.1 动画基本信息查询
cpp
static void GetNumFrames(const UAnimSequenceBase* AnimationSequenceBase, int32& NumFrames);
static void GetNumKeys(const UAnimSequenceBase* AnimationSequenceBase, int32& NumKeys);
static void GetSequenceLength(const UAnimSequenceBase* AnimationSequenceBase, float& Length);
static void GetRateScale(const UAnimSequenceBase* AnimationSequenceBase, float& RateScale);
static void SetRateScale(UAnimSequenceBase* AnimationSequenceBase, float RateScale);
这些是最基础的查询函数。采用"输出参数"模式(引用传出的 int32& / float&),这是蓝图函数库的惯用做法,因为蓝图不支持多返回值。
GetNumFrames 返回 GetNumberOfSampledKeys() - 1 而不是直接返回采样键数------这是因为帧是键之间的区间,比键数少一个。
4.1.2 压缩配置管理
cpp
static void GetBoneCompressionSettings(const UAnimSequence* AnimationSequence, UAnimBoneCompressionSettings*& CompressionSettings);
static void SetBoneCompressionSettings(UAnimSequence* AnimationSequence, UAnimBoneCompressionSettings* CompressionSettings);
static void GetCurveCompressionSettings(const UAnimSequence* AnimationSequence, UAnimCurveCompressionSettings*& CompressionSettings);
static void SetCurveCompressionSettings(UAnimSequence* AnimationSequence, UAnimCurveCompressionSettings* CompressionSettings);
static void GetVariableFrameStrippingSettings(const UAnimSequence* AnimationSequence, UVariableFrameStrippingSettings*& VariableFrameStrippingSettings);
static void SetVariableFrameStrippingSettings(UAnimSequence* AnimationSequence, UVariableFrameStrippingSettings* VariableFrameStrippingSettings);
三组对称的Get/Set,分别管理骨骼压缩、曲线压缩和可变帧剥离设置。Set函数会调用 CompressionSettings->AreSettingsValid() 进行有效性验证。
4.1.3 叠加动画与插值配置
cpp
static void GetAdditiveAnimationType(const UAnimSequence* AnimationSequence, TEnumAsByte<enum EAdditiveAnimationType>& AdditiveAnimationType);
static void SetAdditiveAnimationType(UAnimSequence* AnimationSequence, const TEnumAsByte<enum EAdditiveAnimationType> AdditiveAnimationType);
static void GetAdditiveBasePoseType(const UAnimSequence* AnimationSequence, TEnumAsByte<enum EAdditiveBasePoseType>& AdditiveBasePoseType);
static void SetAdditiveBasePoseType(UAnimSequence* AnimationSequence, const TEnumAsByte<enum EAdditiveBasePoseType> AdditiveBasePoseType);
static void GetAnimationInterpolationType(const UAnimSequence* AnimationSequence, EAnimInterpolationType& InterpolationType);
static void SetAnimationInterpolationType(UAnimSequence* AnimationSequence, EAnimInterpolationType Type);
这些函数直接读写 UAnimSequence 上的对应属性。值得注意的一个设计是,EAdditiveAnimationType 和 EAdditiveBasePoseType 使用了 TEnumAsByte 包装,这是UE对枚举类型的传统处理方式,主要用于网络复制兼容性。
4.1.4 同步标记管理
Sync Marker是UE动画系统中用来标记时间点的一种轻量级机制,常用于动画之间的同步。
核心函数:
cpp
static void AddAnimationSyncMarker(UAnimSequence* AnimationSequence, FName MarkerName, float Time, FName TrackName);
static int32 RemoveAnimationSyncMarkersByName(UAnimSequence* AnimationSequence, FName MarkerName);
static int32 RemoveAnimationSyncMarkersByTrack(UAnimSequence* AnimationSequence, FName NotifyTrackName);
static void RemoveAllAnimationSyncMarkers(UAnimSequence* AnimationSequence);
AddAnimationSyncMarker 的实现包含几个关键步骤:
- 创建一个
FAnimSyncMarker并填充MarkerName、Time、TrackIndex、Guid - 添加到
AnimationSequence->AuthoredSyncMarkers - 将该Marker的指针添加到对应
AnimNotifyTrack的SyncMarkers中 - 调用
RefreshSyncMarkerDataFromAuthored()重新生成运行时同步标记数据 - 调用
RefreshCacheData()刷新所有缓存
4.1.5 Notify事件管理(重点)
这是模块中最复杂的函数群,涉及 FAnimNotifyEvent 的完整生命周期。
添加Notify事件:
cpp
static UAnimNotify* AddAnimationNotifyEvent(UAnimSequenceBase* AnimationSequenceBase, FName NotifyTrackName, float StartTime, TSubclassOf<UAnimNotify> NotifyClass);
实现要点:
- 通过
Link(AnimationSequenceBase, StartTime)方法计算TriggerTimeOffset - 通过
GetTriggerTimeOffsetForType和CalculateOffsetForNotify进行偏移转换 - 创建的
UAnimNotify对象以 AnimationSequenceBase 为 Outer - 使用
RF_Transactional标记,支持撤销/重做
添加NotifyState事件:
cpp
static UAnimNotifyState* AddAnimationNotifyStateEvent(UAnimSequenceBase* AnimationSequenceBase, FName NotifyTrackName, float StartTime, float Duration, TSubclassOf<UAnimNotifyState> NotifyStateClass);
与Notify事件的流程类似,额外步骤是:
NewEvent.SetDuration(Duration)------ 设置持续时长NewEvent.EndLink.Link(AnimationSequenceBase, NewEvent.EndLink.GetTime())------ 建立结束时间链接
替换Notify:
cpp
static void ReplaceAnimNotifies(UAnimSequenceBase* AnimationSequenceBase, TSubclassOf<UAnimNotify> OldNotifyClass, TSubclassOf<UAnimNotify> NewNotifyClass, FOnNotifyReplaced OnNotifyReplaced);
static void ReplaceAnimNotifyStates(UAnimSequenceBase* AnimationSequenceBase, TSubclassOf<UAnimNotifyState> OldNotifyClass, TSubclassOf<UAnimNotifyState> NewNotifyClass, FOnNotifyStateReplaced OnNotifyStateReplaced);
这两个函数都通过内部的 ReplaceAnimNotifies_Helper 实现,替换时完整保留:
StartTime、Length(对于NotifyState)TriggerTimeOffset、EndTriggerTimeOffsetSlotIndex、EndSlotIndexSegmentIndex、EndSegmentIndexLinkMethod、EndLinkMethod
替换完成后通过 OnNotifyReplaced / OnNotifyStateReplaced 委托通知外部。
4.1.6 曲线数据操作
曲线操作通过模板函数实现了高度的代码复用:
cpp
template <typename DataType, typename CurveClass, ERawCurveTrackTypes CurveType>
static void AddCurveKeysInternal(UAnimSequenceBase* AnimationSequenceBase, FName CurveName, const TArray<float>& Times, const TArray<DataType>& KeyData);
内部流程:
- 构建
FAnimationCurveIdentifier(CurveName, CurveType)查找曲线 - 通过
GetDataModel()->FindCurve(CurveId)验证曲线存在 - 获取
GetController()接口 - 通过重载的
SetControllerCurveKeys逐键写入
SetControllerCurveKeys 提供了三个重载版本,分别处理 float(调用 SetCurveKey)、FTransform(调用 SetTransformCurveKey)、FVector(ensure(false),暂时不支持)。
4.1.7 AnimBlueprint操作
cpp
static void GetAnimationGraphs(UAnimBlueprint* AnimationBlueprint, TArray<UAnimationGraph*>& AnimationGraphs);
static void GetNodesOfClass(UAnimBlueprint* AnimationBlueprint, TSubclassOf<UAnimGraphNode_Base> NodeClass, TArray<UAnimGraphNode_Base*>& GraphNodes, bool bIncludeChildClasses = true);
static void AddNodeAssetOverride(UAnimBlueprint* AnimBlueprint, const UAnimationAsset* Target, UAnimationAsset* Override, bool bPrintAppliedOverrides = false);
AddNodeAssetOverride 特别值得一提:它会遍历整个蓝图继承层级(通过 GetBlueprintHierarchyFromClass),找到所有父类蓝图中引用了 Target 资产的 UAnimGraphNode_Base 节点,然后为它们设置 FAnimParentNodeAssetOverride。这个功能在批量迁移动画资产引用时非常实用。
4.1.8 Timecode属性处理
cpp
static bool EvaluateRootBoneTimecodeAttributesAtTime(const UAnimSequenceBase* AnimationSequenceBase, const float EvalTime, FQualifiedFrameTime& OutQualifiedFrameTime);
static bool EvaluateBoneTimecodeAndSlateAttributesAtTime(const FName BoneName, const UAnimSequenceBase* AnimationSequenceBase, const float EvalTime, FQualifiedFrameTime& OutQualifiedFrameTime, FString& OutSlate);
static bool EvaluateRootBoneTimecodeSubframeAttributeAtTime(const UAnimSequenceBase* AnimationSequenceBase, const float EvalTime, float& OutSubframe);
这些函数从骨骼的自定义属性中提取时码元数据。内部定义了一个 FTimecodeBoneAttributeNames 结构体,通过 UAnimationSettings 读取属性名称配置(默认值如 "TCHour"、"TCMinute"、"TCFrame" 等)。
评估流程:
- 逐属性读取值(支持
FFloatAnimationAttribute、FIntegerAnimationAttribute、FStringAnimationAttribute三种底层类型) - 组装
FTimecode结构 - 根据
TCRate属性(优先)或ImportFileFramerate(后备)确定帧率 - 构建
FQualifiedFrameTime返回
4.2 FAnimPose 与 UAnimPoseExtensions
FAnimPose 数据结构
FAnimPose 是UE5.2引入的动画姿态数据结构,定位为"脚本友好的骨骼姿态快照"。其内部维护了12个平行数组:
| 数组 | 类型 | 用途 |
|---|---|---|
BoneNames |
TArray<FName> |
骨骼名称列表 |
BoneIndices |
TArray<int32> |
骨骼在骨架中的索引 |
ParentBoneIndices |
TArray<int32> |
父骨骼索引 |
LocalSpacePoses |
TArray<FTransform> |
局部空间姿态 |
WorldSpacePoses |
TArray<FTransform> |
世界空间姿态(延迟生成) |
RefLocalSpacePoses |
TArray<FTransform> |
参考姿态(局部空间) |
RefWorldSpacePoses |
TArray<FTransform> |
参考姿态(世界空间) |
CurveNames |
TArray<FName> |
曲线名称 |
CurveValues |
TArray<float> |
曲线值 |
SocketNames |
TArray<FName> |
Socket名称 |
SocketParentBoneNames |
TArray<FName> |
Socket父骨骼名称 |
SocketTransforms |
TArray<FTransform> |
Socket相对变换 |
关键设计:
WorldSpacePoses是延迟计算 的,只在GenerateWorldSpaceTransforms()被调用时填充IsValid()通过校验所有数组的长度一致性来判断状态的正确性IsInitialized()(仅检查BoneNames.Num() != 0)和IsPopulated()(检查LocalSpacePoses.Num() != 0)是两层状态标志
FAnimPoseEvaluationOptions
cpp
USTRUCT(BlueprintType)
struct FAnimPoseEvaluationOptions
{
EAnimDataEvalType EvaluationType = EAnimDataEvalType::Raw; // Source / Raw / Compressed
bool bShouldRetarget = true; // 是否重定向
bool bExtractRootMotion = false; // 是否提取根运动
bool bIncorporateRootMotionIntoPose = true; // 是否将根运动融入姿态
TObjectPtr<USkeletalMesh> OptionalSkeletalMesh = nullptr; // 可选参考网格
bool bRetrieveAdditiveAsFullPose = true; // 叠加动画是否展开为完整姿态
bool bEvaluateCurves = true; // 是否评估曲线
};
这个结构体控制了动画评估的方方面面。值得注意的几个参数:
EvaluationType------Source读取原始导入数据,Raw读取含叠加层的数据,Compressed读取压缩后的运行时数据bShouldRetarget------ 设为false可禁用重定向,直接按骨骼索引匹配bRetrieveAdditiveAsFullPose------ 对叠加动画,设为true会自动累加基础姿态得到完整姿态
UAnimPoseExtensions 核心函数
评估动画生成Pose:
cpp
static void GetAnimPoseAtTime(const UAnimSequenceBase* AnimationSequenceBase, double Time, FAnimPoseEvaluationOptions EvaluationOptions, FAnimPose& Pose);
static void GetAnimPoseAtFrame(const UAnimSequenceBase* AnimationSequenceBase, int32 FrameIndex, FAnimPoseEvaluationOptions EvaluationOptions, FAnimPose& Pose);
底层都委托给 GetAnimPoseAtTimeIntervals。该函数的内部流程:
- 确定参考资产(
OptionalSkeletalMesh或AnimationSequenceBase->GetSkeleton()) - 构建
FBoneContainer并配置评估选项(Raw/Source数据、重定向开关) - 对于叠加动画,额外获取
AdditiveBasePose并调用FAnimationRuntime::AccumulateAdditivePose展开 - 使用
FramePose.SetPose(PoseData)将FCompactPose的数据拷贝到FAnimPose的平行数组中
评估动画蓝图:
cpp
static void EvaluateAnimationBlueprintWithInputPose(const FAnimPose& InputPose, USkeletalMesh* TargetSkeletalMesh, UAnimBlueprint* AnimationBlueprint, FAnimPose& OutPose);
这个函数可以用"某个Pose作为输入,经过AnimBlueprint处理后得到输出Pose"------甚至不需要运行游戏,纯编辑器下即可评估。实现过程:
- 检查AnimBlueprint的TargetSkeleton与TargetSkeletalMesh的Skeleton一致
- 创建临时的
FPreviewScene和USkeletalMeshComponent - 设置
AnimInstanceClass为动画蓝图的生成类 - 找到
FAnimNode_LinkedInputPose输入节点 - 将
InputPose的局部空间数据逐骨骼拷贝到CachedInputPose - 调用
Component->InitAnim(true)和RefreshBoneTransforms()触发评估 - 从Component读取结果并填充
OutPose
注意: 函数自身注释中有"Warning this function may cause performance issues",因为它涉及完整的AnimInstance初始化流程。
4.3 UAnimationAttributeBlueprintLibrary
概述
这个类专门处理动画骨骼属性的读写,与 UAnimationBlueprintLibrary 分开的原因是------属性的值类型在编译期无法确定,需要运行时的CustomThunk机制来解析。
CustomThunk机制解析
以 SetAttributeKey 为例,它有三层实现:
第一层:声明层(头文件)
cpp
UFUNCTION(BlueprintCallable, CustomThunk, Category = "Animation|Attributes", meta=(CustomStructureParam="Value", BlueprintInternalUseOnly="true"))
static bool SetAttributeKey(TScriptInterface<IAnimationDataController> AnimationDataController, const FAnimationAttributeIdentifier& AttributeIdentifier, float Time, const int32& Value);
CustomThunk标记告诉UE不要自动生成thunk代码CustomStructureParam="Value"告诉蓝图这个参数的实际类型是动态结构体const int32& Value只是蓝图反射系统需要的占位符,实际不会用到BlueprintInternalUseOnly="true"隐藏此函数不被直接调用(通过K2Node调用)
第二层:Thunk层(execSetAttributeKey)
cpp
DEFINE_FUNCTION(UAnimationAttributeBlueprintLibrary::execSetAttributeKey)
{
P_GET_TINTERFACE(IAnimationDataController, AnimationDataController);
P_GET_STRUCT_REF(FAnimationAttributeIdentifier, AttributeIdentifier);
P_GET_PROPERTY(FFloatProperty, TimeInterval);
Stack.StepCompiledIn<FStructProperty>(nullptr); // 动态获取结构体类型
const FStructProperty* ItemProperty = CastField<FStructProperty>(Stack.MostRecentProperty);
void* ItemDataPtr = Stack.MostRecentPropertyAddress;
P_FINISH;
// ... 校验后转发到 Generic_SetAttributeKey
}
Stack.StepCompiledIn<FStructProperty>(nullptr) 是magic所在------它告诉蓝图虚拟机从调用栈中读取下一个参数的实际类型描述符和内存地址,而不是依赖编译期声明的 const int32&。
第三层:实现层(Generic_SetAttributeKey)
cpp
static bool Generic_SetAttributeKey(TScriptInterface<IAnimationDataController> AnimationDataController, const FAnimationAttributeIdentifier& AttributeIdentifier, float Time, UScriptStruct* ScriptStruct, const void* ValuePtr)
{
return AnimationDataController->SetAttributeKey(AttributeIdentifier, Time, ValuePtr, ScriptStruct);
}
接收已解析的 UScriptStruct* 和 void*,直接转发给 Controller 接口。
4.4 K2Node蓝图节点
四个K2Node子类在构造函数中完成了自描述:
cpp
UK2Node_SetAttributeKeyGeneric::UK2Node_SetAttributeKeyGeneric()
{
FunctionReference.SetExternalMember(GET_FUNCTION_NAME_CHECKED(UAnimationAttributeBlueprintLibrary, SetAttributeKey), ...);
AttributeActionFormat = LOCTEXT("SetAttributeKeyNodetitle", "Set {0} Key");
AttributeValuePinName = ValuePinName;
}
{0} 占位符会在 GetNodeTitle 中被替换为实际连接的结构体类型名,因此在蓝图中看到的节点标题是动态的------比如"Set FloatAnimationAttribute Key"。
IsConnectionDisallowed 实现了两层过滤:
- 结构体必须已通过
UE::Anim::AttributeTypes::IsTypeRegistered注册 - 拒绝
UUserDefinedStruct类型的连接
功能使用示例编写
示例1:批量修改动画序列的压缩设置
cpp
// 假设我们有一个自动化脚本,要对某个文件夹下所有动画统一设置压缩参数
void BatchSetCompressionSettings(const TArray<UAnimSequence*>& Sequences,
UAnimBoneCompressionSettings* BoneSettings,
UAnimCurveCompressionSettings* CurveSettings)
{
for (UAnimSequence* Seq : Sequences)
{
if (!Seq) continue;
// 设置骨骼压缩
if (BoneSettings && BoneSettings->AreSettingsValid())
{
UAnimationBlueprintLibrary::SetBoneCompressionSettings(Seq, BoneSettings);
}
// 设置曲线压缩
if (CurveSettings && CurveSettings->AreSettingsValid())
{
UAnimationBlueprintLibrary::SetCurveCompressionSettings(Seq, CurveSettings);
}
UE_LOG(LogTemp, Log, TEXT("已更新 %s 的压缩设置"), *Seq->GetName());
}
}
示例2:用动画蓝图评估输入Pose(程序化IK验证)
一个很实用的场景------在编辑器下不启动游戏,就验证一段动画经过IK动画蓝图后的结果:
cpp
void EvaluateIKResult(UAnimSequence* SourceAnim, UAnimBlueprint* IKAnimBP, USkeletalMesh* Mesh)
{
if (!SourceAnim || !IKAnimBP || !Mesh) return;
FAnimPoseEvaluationOptions EvalOptions;
EvalOptions.EvaluationType = EAnimDataEvalType::Raw;
EvalOptions.bShouldRetarget = false;
EvalOptions.OptionalSkeletalMesh = Mesh;
FAnimPose InputPose;
// 评估源动画在0.5秒处的姿态
UAnimPoseExtensions::GetAnimPoseAtTime(SourceAnim, 0.5, EvalOptions, InputPose);
if (!UAnimPoseExtensions::IsValid(InputPose))
{
UE_LOG(LogTemp, Error, TEXT("输入Pose无效"));
return;
}
FAnimPose OutputPose;
// 将源Pose送入IK动画蓝图,获取IK后的Pose
UAnimPoseExtensions::EvaluateAnimationBlueprintWithInputPose(
InputPose, Mesh, IKAnimBP, OutputPose);
if (UAnimPoseExtensions::IsValid(OutputPose))
{
// 对比IK前后的手腕位置
const FTransform& WristBeforeIK = UAnimPoseExtensions::GetBonePose(
InputPose, FName("hand_r"), EAnimPoseSpaces::World);
const FTransform& WristAfterIK = UAnimPoseExtensions::GetBonePose(
OutputPose, FName("hand_r"), EAnimPoseSpaces::World);
UE_LOG(LogTemp, Log, TEXT("IK前手腕位置: %s"), *WristBeforeIK.GetLocation().ToString());
UE_LOG(LogTemp, Log, TEXT("IK后手腕位置: %s"), *WristAfterIK.GetLocation().ToString());
}
}
示例3:批量替换Notify并保留所有元数据
假设项目中把所有 UAnimNotify_PlaySound 替换为新实现 UAnimNotify_PlaySoundV2:
cpp
void MigrateSoundNotifies(const TArray<UAnimSequenceBase*>& Sequences)
{
for (UAnimSequenceBase* Seq : Sequences)
{
if (!Seq) continue;
UAnimationBlueprintLibrary::ReplaceAnimNotifies(
Seq,
UAnimNotify_PlaySound::StaticClass(),
UAnimNotify_PlaySoundV2::StaticClass(),
FOnNotifyReplaced::CreateLambda([](UAnimNotify* OldNotify, UAnimNotify* NewNotify)
{
// 可以在这里做额外的数据迁移
UE_LOG(LogTemp, Log, TEXT("替换: %s -> %s"),
*OldNotify->GetName(), *NewNotify->GetName());
})
);
}
}
这个替换过程的优点在于------不需要手动处理时间偏移、SlotIndex、SegmentIndex等复杂字段,ReplaceAnimNotifies_Helper 内部已经完整保留了。
示例4:在蓝图中用CustomThunk节点操作骨骼属性
在蓝图编辑器中:
- 搜索 "Set" + "Key" 节点 → 找到 "Set Attribute Key"
- 连接一个
IAnimationDataController引用(通常来自动画序列的GetController) - 连接
FAnimationAttributeIdentifier(通过Make AnimationAttributeIdentifier构造) - 连接时间值
- 在
Value引脚上连接一个已注册的属性类型结构体(如FloatAnimationAttribute)
底层会通过 execSetAttributeKey 自动解析结构体类型并调用 Generic_SetAttributeKey,开发者无需关心CustomThunk的实现细节。
核心技术栈与依赖分析
| 技术/类 | 用途 |
|---|---|
UBlueprintFunctionLibrary |
UAnimationBlueprintLibrary 和 UAnimPoseExtensions 的基类 |
IAnimationDataController |
动画数据写入的统一接口(曲线键、骨骼轨道、属性键) |
IAnimationDataModel |
动画数据读取的统一接口(曲线查询、属性查询) |
FBoneContainer |
骨骼容器,用于 FAnimPose 初始化和Pose评估 |
FCompactPose |
紧凑姿态表示,用于动画评估过程中的中间数据 |
FBlendedCurve |
混合曲线容器,在Pose评估时承载曲线数据 |
FAnimationPoseData |
聚合 FCompactPose + FBlendedCurve + FStackAttributeContainer |
FMemMark / FMemStack |
UE的内存栈分配器,在Pose评估中使用以避免堆分配 |
CustomThunk |
泛型蓝图函数的技术基础,用于属性键的动态类型解析 |
UK2Node_CallFunction |
蓝图图节点的C++基类,属性操作节点继承自此 |
FAnimNotifyEvent / FAnimSyncMarker |
Notify事件和同步标记的数据结构 |
FQualifiedFrameTime / FTimecode |
时码表示,用于根骨骼时码属性评估 |
总结与最佳实践
核心要点
-
AnimationBlueprintLibrary是编辑器模块,不是运行时模块
所有操作都面向
UAnimSequence等编辑器资产,不要试图在运行时(尤其是Shipping包)中调用。 -
通过Controller写入,通过DataModel读取
这是一个关键的架构约定------曲线和骨骼轨道的修改应始终走
IAnimationDataController(通过GetController()获取),而读取走IAnimationDataModel(通过GetDataModel()获取)。直接操作底层数据结构会导致缓存不一致。 -
FAnimPose替代旧的GetBonePoses*系列函数
UE5.2+ 应该全面使用
FAnimPose+UAnimPoseExtensions,旧API如GetBonePosesForTime、GetBonePoseForTime已标记废弃。 -
CustomThunk的属性操作需要理解三层架构
声明层(占位符类型)、Thunk层(类型解析)、实现层(
Generic_*)各司其职,添加新属性类型时只需在属性注册系统中注册即可,无需修改蓝图函数库代码。 -
Notify操作的元数据完整性
使用
ReplaceAnimNotifies而不是手动删建,确保TriggerTimeOffset、SlotIndex、SegmentIndex、LinkMethod等元数据完整迁移。
常见使用陷阱
陷阱1:忘记调用RefreshCacheData
如果在直接操作 Notifies 数组或 AuthoredSyncMarkers 后忘了调用 RefreshCacheData(),动画编辑器中的显示将不会更新。建议统一使用 UAnimationBlueprintLibrary 封装好的函数(它们内部已包含了刷新逻辑),而不是直接操作底层数据结构。
陷阱2:Pose评估时的Skeleton不匹配
EvaluateAnimationBlueprintWithInputPose 严格要求AnimBlueprint的 TargetSkeleton 与 TargetSkeletalMesh 的Skeleton完全一致。如果输入Pose来自不同的Skeleton,需要先通过重定向流程转换。
陷阱3:属性操作连接了未注册的结构体类型
蓝图中如果属性操作的Value引脚无法连接,检查该结构体类型是否已调用 UE::Anim::AttributeTypes::RegisterType 注册。
陷阱4:Notify Track索引在删除后的偏移
删除一个Notify Track后,后续Track的索引会-1,同时该Track下的所有Notify和SyncMarker也会被清理。RemoveAnimationNotifyTrack 已经处理了索引修正,但如果是手动操作需要注意这一点。
模块的未来演进方向
- Vector曲线键写入支持 :当前
SetControllerCurveKeys对FVector类型只有ensure(false),说明该功能尚未完全实现 - 更多AnimBlueprint操作API :目前只有
GetAnimationGraphs、GetNodesOfClass、AddNodeAssetOverride三个函数,未来可能会扩展更多图节点操作功能 - Pose评估性能优化 :
EvaluateAnimationBlueprintWithInputPose的注释中明确提到性能问题,涉及完整的AnimInstance初始化,后续可能会提供更轻量的评估路径
希望这篇分析能帮助大家更好地理解 AnimationBlueprintLibrary 模块的架构和使用方式。它作为UE动画资产管线的蓝图桥接层,在自动化动画管线、批量资产处理、编辑器工具开发等场景中都有着广泛的应用价值。