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