FBXアニメーションデータを編集できるようにする

FBXモデルをインポートしたとき、アニメーション情報は上書きを防ぐためreadonlyになっています。
この状態だと編集、イベントコールの設定など出来ません。
解決策は、新しいanimファイルを作成しアニメーションデータをコピーします。
するとそれはリンク情報が消えた編集可能なanimファイルになりますので、それを使用します。
How to add new curves or animation events to an imported animation? - Unity Answers
を参考にし、ちょっとだけ改造しました。

const string duplicatePostfix = "_copy";

[MenuItem("Assets/Transfer Clip Curves to Copy")]
static void CopyCurvesToDuplicate()
{
    List<AnimationClip> clipList = new List<AnimationClip>();
    clipList.Clear();
    foreach( Object obj in Selection.objects){
        AnimationClip clip = obj as AnimationClip;
        if ( clip != null ) {
            clipList.Add(clip);
	}
    }

    if ( clipList.Count == 0 ) {
        return;
    }

    foreach( AnimationClip clip in clipList ) {
        AnimationClip copyClip = createFile(clip);
        duplicate( clip, copyClip );
	Debug.Log("Copying curves into " + copyClip.name + " is done");
    }
}

[MenuItem("Assets/〜〜は右クリックダイアログなので便利ですね。

まず最初に選択したオブジェクトからAnimationClipだけコンテナに格納していきます。
as演算子は失敗するとnullを返すキャスティングです。
この性質を利用してAnimationClipだけ格納します。
ちなみに普通の括弧でくくるキャスティングとの違いは、失敗したときの挙動がnull返却か例外発生かというだけです。たぶん。

続いて、リストの中を走査していきます。
createFileメソッドで新しいAnimationClipを作成し、
それに元データをduplicateメソッドでコピーします。

static AnimationClip createFile(AnimationClip importedClip)
{
    string importedPath = AssetDatabase.GetAssetPath( importedClip );
    string copyPath = importedPath.Substring(0, importedPath.LastIndexOf("/"));
    copyPath += "/" + importedClip.name + duplicatePostfix + ".anim";

    AnimationClip src = AssetDatabase.LoadAssetAtPath(importedPath, typeof(AnimationClip)) as AnimationClip;
    AnimationClip newClip = new AnimationClip();
    newClip.name = src.name + duplicatePostfix;
    AssetDatabase.CreateAsset(newClip, copyPath);
    AssetDatabase.Refresh();
    return newClip;
}

まずAssetDatabase.GetAssetPathでプロジェクトの相対パスを獲得します。
続いてSubStringでディレクトリパスを獲得し、copyPathを完成させます。
AssetDatabase.CreateAssetでファイルをAnimationClilpファイルを作成します。

static AnimationClip duplicate(AnimationClip src, AnimationClip dest)
{
    AnimationClipCurveData[] curveDatas = AnimationUtility.GetAllCurves(src, true);
    for (int i = 0; i < curveDatas.Length; i++)
    {
        AnimationUtility.SetEditorCurve(
            dest,
            curveDatas[i].path,
            curveDatas[i].type,
            curveDatas[i].propertyName,
            curveDatas[i].curve
            );
    }
    return dest;
}

アニメーション情報をコピーして、編集な可能なアニメーションクリップの完成です