Baste 发表于 2023-1-24 09:35

【UE】动画属性编辑器开发文档

概述


    动画轨道在动画系统中非常常见,它与动画资源绑定,用于记录动画片段播放时的状态。常见的动画标记有动画曲线(Animation Curve)、同步标记(Step Tag)、动画通知(Notify)等,之后会详细介绍。
    实际使用中,部分曲线仅作开关使用,0表示关,1表示开,这类曲线规则简单且复用性高,比较适合通过编辑器脚本批量添加、删除和修改。本文介绍了在实际研发过程中开发和迭代的几个动画曲线、同步标记的批量编辑脚本的开发思路和使用方法

复制曲线(Copy Curves)

界面介绍





复制曲线界面


[*]【Copy Type】
复制曲线的方式,可选择从特定动画中复制或者根据命名关键字替换搜索获取
(比如不同角色的同一动画配置相同)

[*]【From Sequence】
如果选择从特定动画中复制,需要选择复制的动画资源。

[*]【Copy All Curves】
是否复制所有曲线,当前版本(5.0.3)存在bug,仅支持复制所有曲线,预计在升级5.1后得到修复。

[*]【Curves to Copy】
如果不复制所有曲线,可在此数组中填写需要复制的曲线名。(虚幻5.0.3数组变量有问题,暂不可用)

[*]【Search】
搜索的关键字

[*]【Replace】
替换的关键字

[*]【Search Case】
搜索是否区分大小写

开发思路

Tips:点击上面的链接查看完整蓝图

[*]获取需要复制的动画资源
[*]获取动画资源中的所有曲线名:Get Animation Curve Names
[*]根据曲线名获取Times & Values :Get Float Keys
[*]判断粘贴的动画资源是否包含改曲线,包含则删除。
[*]新增曲线,设置值: Add Float Curve Keys
备注:由于添加曲线的插值默认类型只能是Linear,如果需要修改Value的类型可能需要C++侧提供对应的接口。
<hr/>
添加曲线(Add Curve)

界面介绍





[*]【Default Value】
添加曲线的默认值,会在第0帧设置为这个值。

[*]【Curve Name】
选择已有的曲线名。

[*]【New CUrve Name】
若下拉列表中没有,则填写需要新增的曲线名。

[*]【Is New Curve】
若下拉列表中没有,则勾选此选项。

开发思路

Tips:点击上面的链接查看完整蓝图

[*]获取需要添加曲线的动画资源。
[*]判断曲线是否存在,如果存在则删除。
[*]根据是否为新曲线判断从枚举还是从字符串获取数值。
[*]添加对应命名的曲线,在第0帧K帧默认值。
<hr/>
添加同步标记(Add Step Tag)

界面介绍






[*]【Step On Value】
脚到地面的距离,用于判断脚是否落地。

[*]【Left Foot Name】
左脚骨骼命名

[*]【Left Foot Offset】
左脚落地的距离相对于Step On Value的偏移量

[*]【Right Foot Name】
右脚骨骼命名

[*]【Right Foot Offset】
右脚落地的距离相对于Step On Value的偏移量

开发思路


Tips:点击上面的链接查看完整蓝图

[*]规定:同步标记总是以Step L → Step R → Step L → Step R进行,其中Step L表示左脚落地,Step R表示右脚落地。
[*]逐帧读取动画帧中左右脚的Z轴坐标,当某只脚离地距离小于Step On Value时,根据标签顺序判断是否需要打同步标记。
[*]仅在第一次满足条件时打同步标记,避免重复。
备注:当前方案不好用的原因是不同角度下角色脚落地的距离差异较大
修改思路:同类型的动画时长、节奏往往相同,可根据既定的时间点结合阈值进行微调,比如在给定时间点正负一段时长内的最小值。

<hr/>
设置叠加动画(Set Additive Animation)

界面介绍






[*]【Additive Animation Type】
叠加动画的类型No additive / Local Space / Mesh Space

[*]【Base Sequence】
如果从其他动画选帧作为参考,base的动画资源

[*]【Additive Base Pose Type】
Base Pose的类型,可选择参考 绑定姿势 / 特定动画 / 特定动画帧 / 自身动画的某一帧

[*]【Ref Index】
参考Base动画的哪一帧

开发思路

Tips:点击上面的链接查看完整蓝图

[*]获取需要设置叠加的动画资源
[*]通过python脚本设置叠加(蓝图API拿不到部分属性)
[*]执行和保存
Python Part:
import unreal
def SetAdditiveSettings(anim_sequence, ref_pos_seq, ref_pose_index):
    sequence = unreal.EditorAssetLibrary.load_asset(anim_sequence)
    sequence.set_editor_property("ref_pose_seq", unreal.EditorAssetLibrary.load_asset(ref_pos_seq))
    sequence.set_editor_property("ref_frame_index", ref_pose_index)参考文档

https://zhuanlan.zhihu.com/p/141825438
https://zhuanlan.zhihu.com/p/433929708
页: [1]
查看完整版本: 【UE】动画属性编辑器开发文档