Unity Editor 代码编辑AnimationClip

[MenuItem("Assets/Test/ModifyAnimationClip")]
    public static void ModifyAnimationClip()
    {
        var objectList = Selection.GetFiltered(typeof(Object), SelectionMode.Assets);
        AnimationClip clip = objectList[0] as AnimationClip;
        EditorCurveBinding[] bindings = AnimationUtility.GetCurveBindings(clip);
        // 偏移
        float offsetX = -21f;
        float offsetY = -1f;
        float offsetZ = 2f;
        EditorCurveBinding curveBind;
        for (int index = 0; index < bindings.Length; index++)
        {

            if(bindings[index].propertyName == "m_LocalPosition.x")
            {
                curveBind = bindings[index];
                AnimationCurve curve = AnimationUtility.GetEditorCurve(clip, curveBind);
                var keys = curve.keys;
                for (int fIndex = 0; fIndex < keys.Length; fIndex++)
                {
                    keys[fIndex].value = keys[fIndex].value + offsetX;
                }
                // 这个地方一定要重新赋值,否则不会生效
                curve.keys = keys;
                AnimationUtility.SetEditorCurve(clip, curveBind, curve);
            }
            if (bindings[index].propertyName == "m_LocalPosition.y")
            {
                curveBind = bindings[index];
                AnimationCurve curve = AnimationUtility.GetEditorCurve(clip, curveBind);
                var keys = curve.keys;
                for (int fIndex = 0; fIndex < keys.Length; fIndex++)
                {
                    keys[fIndex].value = keys[fIndex].value + offsetY;
                }
                curve.keys = keys;
                AnimationUtility.SetEditorCurve(clip, curveBind, curve);
            }
            if (bindings[index].propertyName == "m_LocalPosition.z")
            {
                curveBind = bindings[index];
                AnimationCurve curve = AnimationUtility.GetEditorCurve(clip, curveBind);
                var keys = curve.keys;
                for (int fIndex = 0; fIndex < keys.Length; fIndex++)
                {
                    keys[fIndex].value = keys[fIndex].value + offsetZ;
                }
                curve.keys = keys;
                AnimationUtility.SetEditorCurve(clip, curveBind, curve);
            }
        }
        EditorUtility.SetDirty(clip);
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
    }

 用代码编辑后,发现Clip资源变大了,因为里面 m_EditorCurves,m_EulerEditorCurves 多了很多内容,无需担心,在构建时这部分内容会被剔除,如果嫌碍眼可以手动修改,也可用SerializedObject  FindProperty 把 arraySize = 0 来删除这部分数据

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值