https://blog.csdn.net/qq_36292069/article/details/88601302
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
using UnityEngine.Timeline;
public class FacialExpressionEditor : EditorWindow
{
[MenuItem("Tools/ConvertSelectMouth")]
static void ConvertSelectMouth()
{
CloneSelectAnimationClip();
}
private static void ConvertMouthAnimation()
{
DirectoryInfo dir = Directory.CreateDirectory("Assets/Animation");
FileInfo[] files = dir.GetFiles("*.anim");
for(int i=0;i<files.Length;++i)
{
string path = files[i].FullName;
int index = path.IndexOf("Assets");
path = path.Substring(index);
AnimationClip clip = AssetDatabase.LoadAssetAtPath(path, typeof(AnimationClip)) as AnimationClip;
CloneOneAnimationClip(clip);
}
AssetDatabase.Refresh();
}
private static void CloneSelectAnimationClip()
{
AnimationClip clip = Selection.activeObject as AnimationClip;
CloneOneAnimationClip(clip);
AssetDatabase.Refresh();
}
private static void CloneOneAnimationClip(AnimationClip source)
{
if (source == null) return;
EditorCurveBinding[] bindings = AnimationUtility.GetCurveBindings(source);
AnimationClip destClip = new AnimationClip();
destClip.legacy = false;
for (int i = 0; i < bindings.Length; i++)
{
EditorCurveBinding sourceBinding = bindings[i];
AnimationCurve sourceCurve = AnimationUtility.GetEditorCurve(source, sourceBinding);
AnimationCurve destCurve = new AnimationCurve();
Keyframe[] keyframes = sourceCurve.keys;
for (int j = 0; j < keyframes.Length; j++)
{
Keyframe kf = keyframes[j];
Keyframe keyframe = new Keyframe(kf.time, kf.value * 0.01f, kf.inTangent, kf.outTangent, kf.inWeight, kf.outWeight);
keyframe.weightedMode = kf.weightedMode;
destCurve.AddKey(keyframe);
}
destClip.SetCurve(sourceBinding.path, typeof(FacialExpressionCurve), sourceBinding.propertyName, destCurve);
}
AssetDatabase.CreateAsset(destClip, "Assets/BundleRes/Animation/FacialMouth/" + source.name + ".anim");
}
}