募集要項

  • ■ボイスの募集は終了しました。

    非常に沢山のご応募ありがとうございました!

     結果はこちら
2017年12月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

« 【ゲーム】 ドラクエってた。 | トップページ | 【Unity Action】 アニメーションの管理方法の変更(その2) »

2013年12月10日 (火)

【Unity Action】 アニメーションデータの管理方法の変更(その1)

若干Tips寄りな気もしますが、
ふと思い立ってアニメーションデータ(.anim)の管理方法を変更する事にしました。

 思い立った原因
 ・fbx内のAnimationClipを直で指定してる所があった(イベントとバトルの一部
  ⇒何らかが原因で、参照がmissingになった場合、
    
物量的に再指定作業がシンドイにも程がある。
  ⇒fbxデータ自体は最終的には必要ない。

 要は「後が怖いので今のうちに直そう」という事です(笑

 対応要点は以下。
 ・モーションの指定はAnimationClipではなく、stringで行う
 ・AnimationClipは、Fbx内のデータでは無く、リソースフォルダに複製したデータを使う


 
 尚、テーマは「手動でコピーなんてやりたくない」です(※何気に超重要
 モーションデータを更新する度に手動でリソースフォルダにコピーとかは
 流石にナンセンスなので・・・;;

というわけで変更作業開始。

■考え方

 ①モーションデータ(fbx)が追加、更新されたら、自動的に
  リソースフォルダへアニメーションクリップだけをコピーする。
   ※削除、移動時の対応は追々。
 ②既存モーションの事も考慮し、①を手動でも行えるように。
 ③上記に伴うイベントやバトルでのモーションの読み込み処理の修正。


■実践編

 ①更新されたかどうかの判別はOnPostprocessAllAssetsで可能。
   importedAssets インポートされたアセットのパス
   deletedAssets  削除されたパス
   movedAssets   移動したパス
   movedFromPath  移動元のパス
  といった感じで取得できる模様。
  まずは追加、更新なので、↓のような感じで判別してみた。

  foreach(string asset in importedAssets){
   if(asset.Length<xx)return;//判別したいパス以下の文字列だったらその時点で抜けとく
   Debug.Log("Imported : " + asset.Substring(x,xx));//読みたいパスのファイルかどうか判別
   if(asset.Substring(x,xx)=="xxx/xxxx"){
    Debug.Log("データ更新チェック");
   }
  }

 
で、fbxデータを再出力してみた所、ちゃんと自動で識別できてました。
次は、更新したfbxから、アニメーションクリップだけ判別しなくては・・・という事で
まずはオブジェクトのデータを取得。

  GameObject obj = (GameObject)AssetDatabase.LoadAssetAtPath (更新したファイルパス, typeof(GameObject));

で、ここからアニメーションを抜粋・・・は色々試行錯誤して↓で取得。

  Animation anim = obj.GetComponent<Animation>();
  foreach(AnimationState anmstate in anim){
   Debug.Log(anmstate);
  }


そして指定したパスへアニメーションデータのみを複製・・・。
しかし、アニメーションはFBXの中なので、

  AssetDatabase.CopyAsset(コピー元パス,コピー先パス);
 
は使えなそう。
となると、新たにアニメーションクリップを作成かな?
ん?カーブの複製はどうするんだろう。とか色々ひっかかりつつも、↓で何とかいけてる・・・はず。

  AnimationClipCurveData[] curves = AnimationUtility.GetAllCurves(anmstate.clip, true);
  foreach(AnimationClipCurveData curve in curves){
   EditorCurveBinding ecb = new EditorCurveBinding();
   ecb.path=curve.path;
   ecb.type=curve.type;
   ecb.propertyName = curve.propertyName;
   AnimationUtility.SetEditorCurve(copyClip,ecb,curve.curve);
  }


それプラス、wrapModeとか保存名とかその他の項目を設定して↓のコマンドで保存

  AssetDatabase.CreateAsset(copyClip, copyPath);
 
作成したデータを再生してみたところ、動作はしたので多分大丈夫。多分w


 ②それでは、上記で作った処理を、手動でも出来るようにしてみる事にします。
  プロジェクトビューで、キャラクター単位で変換できるようにすれば、
  とりあえずは良いでしょうか。

  と言う訳で、まずは右クリックメニューへのコマンド追加。
  [MenuItem("Assets/SelectMotionCopy")]
  をメソッドの前に置けばOK。簡単でした。
Photo

  次に、選択しているオブジェクト以下のアニメーションの取得ですが、
  これは

  Selection.GetFiltered
 
で取得可能。
タイプがObject[]になるので、GetType()でGameObjectを判別しました。
あとは①と同じように取得したAnimationClipをコピっていけば良い感じですね。


と、いうわけで珍しく長めになりましたが、
AnimationClip自体の自動&手動コピーはできました。
明日はこれをバトル、イベント用に使えるように弄っていく予定です。
一部供用してるモーションとかあるのでその辺りがキモになりそう・・・( ; ゚Д゚)

こういった作業は、実際に組んでる時間より、
ドキュメント調べたりしてる時間が
圧倒的に長いです
・゚・(つД`)・゚・知識不足。
この辺りが本職プログラマだと調べるの早いんでしょうね・・・
経験から色々な紐付けができると思うので。

こういった作業は、直接の進捗とは言い難いですが、
作るものを問わず、必要になってくる処理とか考え方だと思うので、
作成中のゲームに限らず、長い目で見ても有効・・・なず。

« 【ゲーム】 ドラクエってた。 | トップページ | 【Unity Action】 アニメーションの管理方法の変更(その2) »

Unityアクションゲーム製作」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1500357/54216482

この記事へのトラックバック一覧です: 【Unity Action】 アニメーションデータの管理方法の変更(その1):

« 【ゲーム】 ドラクエってた。 | トップページ | 【Unity Action】 アニメーションの管理方法の変更(その2) »

Twitter等

  • にほんブログ村 ゲームブログ ゲーム制作へ

メールフォーム

  • 直接コンタクト取りたい方はこちらからどうぞ

サイト内検索
ココログ最強検索 by 暴想