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 来删除这部分数据

你可能感兴趣的:(unity,AnimationClip)