UE5源码分析之Editor——AnimationBlueprintLibrary模块全面分析

AnimationBlueprintLibrary 模块全面系统分析


目录

  1. 写在前面:为什么需要这个模块
  2. 模块概述
  3. 模块整体架构解析
  4. 类级代码注释详解
  5. 功能使用示例编写
  6. 核心技术栈与依赖分析
  7. 总结与最佳实践

### 文章目录

  • [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动画资产操作管线的"蓝图桥接层" 。底层的UAnimSequenceUAnimDataModelIAnimationDataController等类负责真正的数据读写和压缩,而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 :提供 UAnimSequenceUAnimSequenceBaseUAnimMontage 等核心动画资产类型
  • AnimGraph :提供 UAnimGraphNode_BaseUAnimationGraph 等动画蓝图图节点类型(用于 GetAnimationGraphsGetNodesOfClass 等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操作。

  • 基本信息GetNumFramesGetNumKeysGetSequenceLengthGetRateScale / SetRateScale
  • 压缩配置Get/SetBoneCompressionSettingsGet/SetCurveCompressionSettingsGet/SetVariableFrameStrippingSettings
  • 叠加动画Get/SetAdditiveAnimationTypeGet/SetAdditiveBasePoseType
  • 插值与根运动Get/SetAnimationInterpolationTypeIsRootMotionEnabled / SetRootMotionEnabledGet/SetRootMotionLockTypeIsRootMotionLockForced / SetIsRootMotionLockForced
  • 轨道查询GetAnimationTrackNamesGetMontageSlotNamesGetAnimationCurveNames

2. Notify与同步标记管理域

这是整个模块中业务逻辑最密集的区域,涵盖了Animation Notify的完整生命周期:

  • 同步标记GetAnimationSyncMarkersGetUniqueMarkerNamesAddAnimationSyncMarkerRemoveAnimationSyncMarkersByName/ByTrackRemoveAllAnimationSyncMarkers
  • Notify事件GetAnimationNotifyEventsGetAnimationNotifyEventNamesAddAnimationNotifyEventAddAnimationNotifyStateEventAddAnimationNotifyEventObjectAddAnimationNotifyStateEventObjectRemoveAnimationNotifyEventsByName/ByTrack
  • Notify替换与复制ReplaceAnimNotifiesReplaceAnimNotifyStatesCopyAnimNotifiesFromSequence
  • Notify轨道GetAnimationNotifyTrackNamesAddAnimationNotifyTrackRemoveAnimationNotifyTrackRemoveAllAnimationNotifyTracksIsValidAnimNotifyTrackName
  • 工具函数GetAnimNotifyEventTriggerTimeGetAnimNotifyEventDuration

值得注意的是,ReplaceAnimNotifies_Helper 这个内部函数展示了非常精细的Notify迁移逻辑------它不会简单地把旧Notify删了新建,而是完整保留了:TriggerTimeOffset、SlotIndex、SegmentIndex、LinkMethod、EndLink等所有元属性,确保替换后的Notify在时间线上的行为与原来完全一致。

3. 曲线数据操作域

针对三种标准曲线类型(Float / Vector / Transform)提供了对称的Add/Get接口:

  • 曲线创建/删除AddCurveRemoveCurveRemoveAllCurveData
  • 键操作AddFloatCurveKey/KeysAddVectorCurveKey/KeysAddTransformationCurveKey/Keys
  • 键查询GetFloatKeysGetVectorKeysGetTransformationKeysGetFloatValueAtTime
  • 曲线存在性检查DoesCurveExist

这套API内部通过模板函数 AddCurveKeysInternalGetCurveKeysInternal 实现了类型安全的复用,底层最终通过 IAnimationDataController 接口写入(而非直接操作RawData),遵循了UE5动画数据管线的标准架构。

4. Pose评估与操作域(UAnimPoseExtensions + FAnimPose)

这是UE5.2之后重点推广的新API体系,用于替代已废弃的旧 GetBonePosesForTime/Frame 系列函数:

  • Pose生成GetAnimPoseAtTimeGetAnimPoseAtFrameGetReferencePose
  • 骨骼操作GetBonePoseSetBonePoseGetRefBonePoseGetBoneNames
  • 相对变换GetRelativeTransformGetRelativeToRefPoseTransformGetRefPoseRelativeTransform
  • SocketGetSocketNamesGetSocketPose
  • 曲线GetCurveNamesGetCurveWeight
  • 动画蓝图评估EvaluateAnimationBlueprintWithInputPose

FAnimPose 本身是一个USTRUCT,内部维护了多组平行数组:BoneNamesBoneIndicesParentBoneIndicesLocalSpacePosesWorldSpacePosesRefLocalSpacePosesRefWorldSpacePosesCurveNamesCurveValuesSocketNamesSocketParentBoneNamesSocketTransforms。这种设计使得它在给定 FBoneContainer 初始化后,可以作为一个独立的"快照"来传递和处理,不再需要每次都回头查原始动画数据。

5. 属性(Attribute)操作域

这是模块中实现最特殊的部分------因为属性的值类型是泛型的(可以是 FFloatAnimationAttributeFIntegerAnimationAttributeFStringAnimationAttribute 等任意注册类型),无法直接用常规的 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 })

模块设计亮点

  1. 统一的"操作→刷新缓存"模式 :几乎所有写操作最后都调用了 RefreshCacheData()RefreshSyncMarkerDataFromAuthored(),保证了动画资产内部缓存的一致性,这是很多自研工具容易忽略的细节。

  2. CustomThunk的创造性使用UAnimationAttributeBlueprintLibrary 对泛型属性类型的处理方式是一个很好的 CustomThunk 教材------占位符声明、运行时类型解析、分离的 Generic_* 逻辑层,三层配合实现了蓝图侧的灵活类型支持。

  3. 完整的参数校验体系:每个操作函数都有一层格式化的参数验证(时间范围、轨道名存在性、骨骼名存在性、Outer正确性等),并有对应的Warning/Error日志输出,这在自动化管线(如Python脚本批量处理动画资产)中至关重要。

  4. 向前兼容的废弃标记 :对已迁移到 IAnimationDataModel / FAnimPose 的旧API(如 GetRawTrackPositionDataGetBonePosesForTime),都标记了 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 上的对应属性。值得注意的一个设计是,EAdditiveAnimationTypeEAdditiveBasePoseType 使用了 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 的实现包含几个关键步骤:

  1. 创建一个 FAnimSyncMarker 并填充 MarkerNameTimeTrackIndexGuid
  2. 添加到 AnimationSequence->AuthoredSyncMarkers
  3. 将该Marker的指针添加到对应 AnimNotifyTrackSyncMarkers
  4. 调用 RefreshSyncMarkerDataFromAuthored() 重新生成运行时同步标记数据
  5. 调用 RefreshCacheData() 刷新所有缓存

4.1.5 Notify事件管理(重点)

这是模块中最复杂的函数群,涉及 FAnimNotifyEvent 的完整生命周期。

添加Notify事件:

cpp 复制代码
static UAnimNotify* AddAnimationNotifyEvent(UAnimSequenceBase* AnimationSequenceBase, FName NotifyTrackName, float StartTime, TSubclassOf<UAnimNotify> NotifyClass);

实现要点:

  • 通过 Link(AnimationSequenceBase, StartTime) 方法计算 TriggerTimeOffset
  • 通过 GetTriggerTimeOffsetForTypeCalculateOffsetForNotify 进行偏移转换
  • 创建的 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 实现,替换时完整保留:

  • StartTimeLength(对于NotifyState)
  • TriggerTimeOffsetEndTriggerTimeOffset
  • SlotIndexEndSlotIndex
  • SegmentIndexEndSegmentIndex
  • LinkMethodEndLinkMethod

替换完成后通过 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);

内部流程:

  1. 构建 FAnimationCurveIdentifier(CurveName, CurveType) 查找曲线
  2. 通过 GetDataModel()->FindCurve(CurveId) 验证曲线存在
  3. 获取 GetController() 接口
  4. 通过重载的 SetControllerCurveKeys 逐键写入

SetControllerCurveKeys 提供了三个重载版本,分别处理 float(调用 SetCurveKey)、FTransform(调用 SetTransformCurveKey)、FVectorensure(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" 等)。

评估流程:

  1. 逐属性读取值(支持 FFloatAnimationAttributeFIntegerAnimationAttributeFStringAnimationAttribute 三种底层类型)
  2. 组装 FTimecode 结构
  3. 根据 TCRate 属性(优先)或 ImportFileFramerate(后备)确定帧率
  4. 构建 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。该函数的内部流程:

  1. 确定参考资产(OptionalSkeletalMeshAnimationSequenceBase->GetSkeleton()
  2. 构建 FBoneContainer 并配置评估选项(Raw/Source数据、重定向开关)
  3. 对于叠加动画,额外获取 AdditiveBasePose 并调用 FAnimationRuntime::AccumulateAdditivePose 展开
  4. 使用 FramePose.SetPose(PoseData)FCompactPose 的数据拷贝到 FAnimPose 的平行数组中

评估动画蓝图:

cpp 复制代码
static void EvaluateAnimationBlueprintWithInputPose(const FAnimPose& InputPose, USkeletalMesh* TargetSkeletalMesh, UAnimBlueprint* AnimationBlueprint, FAnimPose& OutPose);

这个函数可以用"某个Pose作为输入,经过AnimBlueprint处理后得到输出Pose"------甚至不需要运行游戏,纯编辑器下即可评估。实现过程:

  1. 检查AnimBlueprint的TargetSkeleton与TargetSkeletalMesh的Skeleton一致
  2. 创建临时的 FPreviewSceneUSkeletalMeshComponent
  3. 设置 AnimInstanceClass 为动画蓝图的生成类
  4. 找到 FAnimNode_LinkedInputPose 输入节点
  5. InputPose 的局部空间数据逐骨骼拷贝到 CachedInputPose
  6. 调用 Component->InitAnim(true)RefreshBoneTransforms() 触发评估
  7. 从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 实现了两层过滤:

  1. 结构体必须已通过 UE::Anim::AttributeTypes::IsTypeRegistered 注册
  2. 拒绝 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节点操作骨骼属性

在蓝图编辑器中:

  1. 搜索 "Set" + "Key" 节点 → 找到 "Set Attribute Key"
  2. 连接一个 IAnimationDataController 引用(通常来自动画序列的 GetController
  3. 连接 FAnimationAttributeIdentifier(通过 Make AnimationAttributeIdentifier 构造)
  4. 连接时间值
  5. Value 引脚上连接一个已注册的属性类型结构体(如 FloatAnimationAttribute

底层会通过 execSetAttributeKey 自动解析结构体类型并调用 Generic_SetAttributeKey,开发者无需关心CustomThunk的实现细节。


核心技术栈与依赖分析

技术/类 用途
UBlueprintFunctionLibrary UAnimationBlueprintLibraryUAnimPoseExtensions 的基类
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 时码表示,用于根骨骼时码属性评估

总结与最佳实践

核心要点

  1. AnimationBlueprintLibrary是编辑器模块,不是运行时模块

    所有操作都面向 UAnimSequence 等编辑器资产,不要试图在运行时(尤其是Shipping包)中调用。

  2. 通过Controller写入,通过DataModel读取

    这是一个关键的架构约定------曲线和骨骼轨道的修改应始终走 IAnimationDataController(通过 GetController() 获取),而读取走 IAnimationDataModel(通过 GetDataModel() 获取)。直接操作底层数据结构会导致缓存不一致。

  3. FAnimPose替代旧的GetBonePoses*系列函数

    UE5.2+ 应该全面使用 FAnimPose + UAnimPoseExtensions,旧API如 GetBonePosesForTimeGetBonePoseForTime 已标记废弃。

  4. CustomThunk的属性操作需要理解三层架构

    声明层(占位符类型)、Thunk层(类型解析)、实现层(Generic_*)各司其职,添加新属性类型时只需在属性注册系统中注册即可,无需修改蓝图函数库代码。

  5. Notify操作的元数据完整性

    使用 ReplaceAnimNotifies 而不是手动删建,确保 TriggerTimeOffsetSlotIndexSegmentIndexLinkMethod 等元数据完整迁移。

常见使用陷阱

陷阱1:忘记调用RefreshCacheData

如果在直接操作 Notifies 数组或 AuthoredSyncMarkers 后忘了调用 RefreshCacheData(),动画编辑器中的显示将不会更新。建议统一使用 UAnimationBlueprintLibrary 封装好的函数(它们内部已包含了刷新逻辑),而不是直接操作底层数据结构。

陷阱2:Pose评估时的Skeleton不匹配

EvaluateAnimationBlueprintWithInputPose 严格要求AnimBlueprint的 TargetSkeletonTargetSkeletalMesh 的Skeleton完全一致。如果输入Pose来自不同的Skeleton,需要先通过重定向流程转换。

陷阱3:属性操作连接了未注册的结构体类型

蓝图中如果属性操作的Value引脚无法连接,检查该结构体类型是否已调用 UE::Anim::AttributeTypes::RegisterType 注册。

陷阱4:Notify Track索引在删除后的偏移

删除一个Notify Track后,后续Track的索引会-1,同时该Track下的所有Notify和SyncMarker也会被清理。RemoveAnimationNotifyTrack 已经处理了索引修正,但如果是手动操作需要注意这一点。

模块的未来演进方向

  1. Vector曲线键写入支持 :当前 SetControllerCurveKeysFVector 类型只有 ensure(false),说明该功能尚未完全实现
  2. 更多AnimBlueprint操作API :目前只有 GetAnimationGraphsGetNodesOfClassAddNodeAssetOverride 三个函数,未来可能会扩展更多图节点操作功能
  3. Pose评估性能优化EvaluateAnimationBlueprintWithInputPose 的注释中明确提到性能问题,涉及完整的AnimInstance初始化,后续可能会提供更轻量的评估路径

希望这篇分析能帮助大家更好地理解 AnimationBlueprintLibrary 模块的架构和使用方式。它作为UE动画资产管线的蓝图桥接层,在自动化动画管线、批量资产处理、编辑器工具开发等场景中都有着广泛的应用价值。

相关推荐
远离UE49 小时前
UE5 ECS 原理
ue5
mengzhi啊2 天前
UE5 把剑绑定到骨骼-给要播放的动画及动画蒙太奇添加武器
ue5
directx3d_beginner2 天前
32,每帧更新怪物朝向改为c++
ue5
日月云棠2 天前
UE5源码分析之Editor——AnimationEditor模块全面分析
ue5
吴梓穆3 天前
UE5 播放透明视频
ue5
日月云棠3 天前
UE5源码分析之Editor——AnimationBlueprintEditor模块全面分析
ue5
远离UE43 天前
UE5 不同贴图采样类型的区别
ue5
日月云棠4 天前
UE5源码分析——ActorPickerMode模块全面分析
ue5
weixin_404679315 天前
虚幻5 如何打开关卡蓝图
ue5