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

相关推荐

  1. Unity Editor 代码编辑AnimationClip

    2023-12-22 20:32:01       62 阅读
  2. 代码编写规范

    2023-12-22 20:32:01       42 阅读
  3. 交叉编译代码

    2023-12-22 20:32:01       45 阅读
  4. C语言代码编码规范

    2023-12-22 20:32:01       62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-22 20:32:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-22 20:32:01       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-22 20:32:01       82 阅读
  4. Python语言-面向对象

    2023-12-22 20:32:01       91 阅读

热门阅读

  1. 187. LCR 破冰游戏

    2023-12-22 20:32:01       66 阅读
  2. 【Mysql】哪些sql无法使用到索引

    2023-12-22 20:32:01       49 阅读
  3. 掌握Jenknis基础概念

    2023-12-22 20:32:01       60 阅读
  4. 如何查看计算机(笔记本)设备的SN

    2023-12-22 20:32:01       141 阅读
  5. C语言指针基础题(三)

    2023-12-22 20:32:01       76 阅读
  6. elasticsearch8.5版本集成springboot高版本3.0.0开发

    2023-12-22 20:32:01       54 阅读
  7. 列表的上移动和下移动实现

    2023-12-22 20:32:01       59 阅读