Open1

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

suudai nsuudai n

アニメーションを複製してキーフレームを書き換えるには、新しい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);
           }
       }
   }
}

これにより、新しいアニメーションクリップには元のアニメーションクリップの最初のキーフレームの値だけが反映され、それ以降のキーフレームの値は無視されるようになります。