Open1
Unityのスクリプトでアニメーションのキーフレームを編集、追加、削除したい

アニメーションを複製してキーフレームを書き換えるには、新しいAnimationCurveのインスタンスを作成する必要があるわけか。
これで試してみたらアニメーションの書き換えが上手くいったっぽい。
Unityのアニメーションシステムの仕様上、
AnimationUtility.GetEditorCurve
はTransformの変化を表すカーブしか取得できないため、ここで取得しているカーブはnullになる可能性があります。また、Unityは独自の最適化により、全てのキーフレームが同じ値を持つ場合、カーブを平坦化(つまり、一定の値に)する可能性もあります。これが原因でアニメーションが変更されずに同じに見えるかもしれません。そこで、アニメーションクリップを複製し、カーブを編集する方法を見直すことをお勧めします。以下に示す方法では、
AnimationClip
を直接複製するのではなく、それぞれのカーブを新しいAnimationClip
に追加することで、新しいアニメーションクリップを作成します。以下に示すサンプルコードでは、新しいアニメーションクリップが作成され、そのすべてのキーフレームが最初のキーフレームの値に設定されます。
private void OnPostprocessAnimation(GameObject root, AnimationClip clip) { // Create a new clip var newClip = new AnimationClip(); newClip.name = clip.name + "_copy"; AnimationClips.Add(newClip); var bindings = AnimationUtility.GetCurveBindings(clip); foreach (var binding in bindings) { var oldCurve = AnimationUtility.GetEditorCurve(clip, binding); if (oldCurve != null) { var newCurve = new AnimationCurve(); newCurve.AddKey(oldCurve.keys[0]); AnimationUtility.SetEditorCurve(newClip, binding, newCurve); } else { var oldCurve2 = AnimationUtility.GetObjectReferenceCurve(clip, binding); if (oldCurve2 != null) { var newCurve2 = new ObjectReferenceKeyframe[1]; newCurve2[0] = oldCurve2[0]; AnimationUtility.SetObjectReferenceCurve(newClip, binding, newCurve2); } } } }
これにより、新しいアニメーションクリップには元のアニメーションクリップの最初のキーフレームの値だけが反映され、それ以降のキーフレームの値は無視されるようになります。