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; }
アニメーション情報をコピーして、編集な可能なアニメーションクリップの完成です