SpriteStudio to Unity2D Convert Pipeline

【 2016/08/25 23:51 】by 月琴かりん

はじめに

CEDEC期間中で時間があったので、うちの同人ゲームで使っている、SpriteStudio から Unity2D の変換Pipelineを纏めました。

SpriteStudioで作ったらすぐUnityで使える、、というのを目標にもろもろ自動化してます。

ユーザから見たフロー

といっても、いきなりはイメージしづらいので、まず、実際のフローを載せて、その後、それぞれのフロー内部で何をやってるのか説明します。

Step1: SpriteStudioでアニメーションデータを作る

Step2: sspjをドロップレットにドラッグ&ドロップ

Step3: Unity側でPrefabをドラッグ&ドロップして動作チェック

アニメーションまでセットアップ済なので、Unity側で弄る事は基本ない。これくらいまでやっておくとホント楽です。

各StepでのPipeline

Step1: SpriteStudioでアニメーションデータを作る

graph TD; A[ SpriteStudio ];

Step2: sspjをドロップレットにドラッグ&ドロップ

graph TD; A[ SpriteStudio ] A-->|sspjをドラッグアンドドロップ|B[ ドロップレット ]; B-->|パス情報を抽出してMake呼び出し|C[ Makefile ]; C-->|コンバート用プロジェクトを初期化してバッチモードで変換処理|E[ Unity ]; E-->D C-->|Wait|D[ Makefile ]; D-->|コンバート用プロジェクトを初期化してバッチモードでAnimator設定処理|G[ Unity ]; G-->F D-->|Wait|F[ Makefile ]; F-->|成果物をメインプロジェクトへ同期|I[ Shell ]; I-->J F-->|Wait|J[ Makefile ]; J-->|クリーンナップと終了通知|K[ 完了 ] B-->|ダイアログ表示しつつ待機|K

補足1:ドロップレットの実装について

補足2:「コンバート用プロジェクトを初期化してバッチモードで変換処理」について

Ss5ConverterForUnity2D に以下の改良を加えたものを呼び出しています。

  • Unity5.3対応
  • コンバート時に各フレームにキーを打ったコマアニメにするのではなく、UnityのCurveを使ったキーフレームアニメーションへ変換するように変更
    • 全フレームにキー振っててパフォーマンスゲロだったので
  • 加速/減速アニメーションへ対応
  • 引数に応じて、Layerを設定するように変更

補足3:「コンバート用プロジェクトを初期化してバッチモードでAnimator設定処理」について

完全に独自。オリジナルの変換だけだと、メインプロジェクトに取り込んだ後にAnimationControllerを作ってセットしたりとかいろいろ手間だったので、以下の処理を実行。

  • 前段階で生成したAnimationClipを取得して、引数に応じてパラメータ更新(ループ設定、再生速度とか)
  • AnimationControllerを生成して、AnimationClipを割当
    • Animation ControllerのLayer名をハッシュ比較のバグに対処した名前に変えておく
    • 各ステートに対応したboolフラグを予め生成しておく(大抵制御で使うから)
  • 前段階で生成したPrefabを取得して、生成したAnimationControllerをAttachして保存
  • Prefab内に一部特殊な要素が含まれる場合、Prefab内のノードに対して、Textコンポーネントつけたりとかもしてる。

補足4:メインプロジェクトとコンバート用プロジェクトについて

  • コンバート時にはオリジナルファイルがもろもろ必要になるがメインプロジェクトには必要ない。データ管理上、メインにそういう余計なゴミが混ざって欲しくないので、あえて別プロジェクトで処理
    • 予期せぬエラーが起きた場合でもメインプロジェクトへの被害ゼロというのも嬉しい
  • メインプロジェクトとコンバート用プロジェクトの間で、 ProjectSettings/TagManager.asset は同期しておかないとコンバート時にLayerが適切に設定出来ないので注意

Step3: Unity側で動作チェック

graph TD; A[ Unity ]; A-->|動作チェック用シーンでプレビュー|B[ 完了 ];

補足:実際のゲーム中からの呼び出し

同期先を、Resources/ に切っているので、スクリプトから事前の命名規則に応じてPrefabを取得して、Instantiate() するだけです。

同人規模なのでこれで困ってはいない、事情に合わせてAssetBundle化するバッチ処理を追加が必要だとは思う。

Link Infomation

alomarron

サイト内検索