composer中无一键清除单个属性所有关键帧功能,因其底层依赖animationclip.setcurve(),需通过脚本读取原曲线、创建空animationcurve并精确绑定路径、类型后写回。

Composer 里没有“清除单个属性所有关键帧”的一键命令——这是常见误解的根源。你看到的“关键帧”实际是绑定在动画曲线编辑器(Graph Editor)或时间轴(Timeline)上的数据点,而 Composer 本身不直接暴露关键帧管理 API 给用户操作。
为什么 clearKeyframes() 在 Composer 中根本不存在
Composer 是 Unity 的新动画系统(Animator + AnimationClip 驱动),它底层用的是 AnimationCurve 和 AnimationClip.SetCurve()。所谓“某个属性的关键帧”,本质是写入到 AnimationClip 中某条曲线上的采样点。Unity 没提供按属性名批量删关键帧的公开方法,AnimationClip 的编辑接口只支持整体替换曲线(SetCurve)或逐帧读取/重写(GetCurve + 手动过滤)。
- 调用
AnimationClip.ClearCurves()会清空整个 Clip 的所有属性,不是单个 -
AnimationClip.EnsureQuaternionContinuity()等是辅助函数,不涉及关键帧删除 - 编辑器里右键关键帧 → “Delete” 只能单点操作,无法按属性筛选
真正可行的实操方案:用脚本按属性名重建曲线
核心思路是:读出原 Clip 中该属性对应的 AnimationCurve,过滤掉所有关键帧(即留空曲线),再用 SetCurve() 写回去。注意必须指定正确的类型(float、Vector3、Quaternion)和属性路径(如 "m_LocalPosition.x")。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 属性路径要严格匹配:用
AnimationUtility.GetAnimatableProperties(clip)查真实路径,别手敲"transform.position.x"(这是错的) - 对
Vector3类型,需分别处理.x、.y、.z三条子曲线 - 执行前备份 Clip,
SetCurve()是覆盖写入,不可撤销 - 示例片段:
var clip = Selection.activeObject as AnimationClip; string bindingPath = "RootNode.m_LocalScale.x"; // 必须从 GetAnimatableProperties 获取 EditorCurveBinding binding = EditorCurveBinding.FloatCurve(bindingPath, typeof(Transform), "m_LocalScale.x"); AnimationCurve emptyCurve = new AnimationCurve(); // 空曲线 = 删除所有关键帧 clip.SetCurve(binding.path, binding.type, binding.propertyName, emptyCurve);
容易被忽略的坑:曲线类型不匹配会导致静止或报错
即使路径对了,如果 EditorCurveBinding 构造时传错 type 或 propertyName,SetCurve() 会静默失败——Clip 看起来没变,但下次播放可能丢值或报 InvalidOperationException: Curve is not of expected type。
-
type必须是实际组件类型:位置缩放旋转都是typeof(Transform),UI 的RectTransform要用typeof(RectTransform) -
propertyName不是字段名:例如"localEulerAnglesRaw.x"对应旋转,不能写成"eulerAngles.x" - 修改后需调用
EditorUtility.SetDirty(clip)并AssetDatabase.SaveAssets()才生效
真正耗时的不是代码,而是准确拿到目标属性的 binding 信息——多花 30 秒用 AnimationUtility.GetAnimatableProperties() 打印一遍,比反复试错快十倍。










