Posted at

SpriteStudio3rdParty/Ss5ConverterForUnity2D をアレコレしたメモ

More than 3 years have passed since last update.


これはなに?


https://github.com/SpriteStudio3rdParty/Ss5ConverterForUnity2D


で公開されている、SpriteStudioのデータをuGUIに変換するスクリプトが素の状態だと


  • 問題1:Unity5.2/5.3で動かない

  • 問題2:手動作業大杉

  • 問題3:プロジェクトのAssetsを汚染する

と色々問題があって使えなかったので、いい感じに使えるようにしたメモ


問題1:Unity5.2/5.3で動かない


  • Animator周りの変更とEditor側のAPIが大きく変更してるので直す。


    • Animator周りは移行先APIがなかったりするのがあり、ちょっと調べないとダメ。


      • そのうち直したやつをブランチでGithubに投げます。






問題2:手動作業大杉、問題3:プロジェクトのAssetsを汚染する


そもそものフロー


  • sspj/ssae をプロジェクトにAssetとして配置する

  • 右クリックでコンバートを選択

  • コンバート後に、別途AnimationControllerを作成

  • AnimationControllerに、コンバートで追加されたAnimationを登録


    • Animation遷移を適宜設定



  • AnimationControllerをコンバートで生成されたPrefabに設定

  • Prefabをヒエラルキーに追加

やってられるか!


改善後のフロー


  • sspjをドラッグ&ドロップで、必要なPrefab,Material...etcのみがプロジェクトに追加される。


どうやっているのか?

基本的なアプローチは


  • オリジナルの拡張をbatchモードで呼べるように改造した上で、別プロジェクトにセットアップ。

  • メインプロジェクトからサブプロジェクトをバッチモードで呼び出して必要な成果物をメイン側にコピー

追加した処理とかなんか色々は下記の通り


  • Assets/Work/ 以下に、指定した sspj/ssae をコピー

  • batchモードでコンバート

  • さらにbatchモードで


    • AnimationControllerをUnity2D/{sspj名}/ に生成

    • animを取得して紐付け

    • Prefabを取得して、AnimationContollerを設定



  • batchのPostProcessで、 Unity2D/{sspj名}/ を共有フォルダにコピー

  • Work, Unity2Dフォルダをクリア

  • メインのプロジェクトからは、共有フォルダを参照して、ディレクトリ指定でコピーしてAssetReloadするエディタ拡張を作っておく。 > 共有ディレクトリを、プロジェクト直下に作っておくと吉か。


    • とりあえず、めんどいのでMakefile拡張で処理した


      • この時の注意として、更新時にヒエラルキーのPrefabが死ぬ。


        • いろいろ弊害はあるが、更新時には、AnimationController/Prefabは上書きしないように。

        • ディレクトリを切っているので、rsyncが差分は放置してくれるし手っ取り早い。更新時はexcludeで除外すればよい。








TODO: Animationの遷移の自動化



その他


  • Canvasに配置するが、Overlayだとスケールがおかしいことになる。(SpriteStudioではよくあること。。


    • ScreenSpace Camera に設定して、Canvas 描画用のカメラを設定するとよい。


      • うちはこのあたり変なことをやってるけど...





  • そもそもCanvas配下におかないてでいいのでは?


    • スケールがめんどくさくなるので、Canvas配下への設置奨励



  • 重ね順は優先度ののプロパティで決まるので、確実に設定する事。(Default - 0 なので確実に設定しないとUIと被る


    • UIのLayer設計によっては、変換する段階で別のレイヤー参照させておいた方がいいかも



  • SpriteStudioより上にUI被せたい


    • CanvasのLayerをより上位のLayerに指定してやるのが無難。