描いた絵を Unity の Anima2D でぴたっと配置するための我流メモ

[Anima2D](https://www.assetstore.unity3d.com/jp/) は人物などの絵を、手足などのパーツ画像ごとに動かしてアニメーションさせる [Unity](https://unity3d.com/jp) の無料のアセットです。（髪やリボンもゆらせます）
Spine と似ています。

![miko_anima2d_animation20180708.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/64d93729-15f3-dced-54ff-5a7e624a1ca4.gif)


実際にやってみて、用意したパーツ画像を Unity で手作業で再び配置するのは、

* 面倒
* どうしても正確に配置できなくて絵の印象がかわる

と思ったので、そこらへんの対策を自分なりに考えてみました。

この記事では、画像を用意した段階から、 Anima2D 用の自前のエディタ拡張 [SCAnima2DHelper](https://github.com/sakura-crowd/SCAnima2DHelper) を使って配置するところまでの工程を紹介します。
ぴたっと配置させるために、パーツ画像のトリミングデータ(切り抜いた座標)や重なり順の情報が必要になるので、その点についても説明します。
Anima2D の SpriteMesh Editor の頂点編集の備忘録も少し書いています。

![Anima2DHelper_demo20180706.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/b8167dc1-8272-a37c-d2a2-14ff1b4c0cfe.gif)


※途中で win 版のみのツールを使用しています。トリミング＋トリミング情報の取得部分で使うツールで、手作業でも可能な部分ですが、win 以外で利用される方は代替のソフトなどがないとしんどいかもしれません。

#Anima2Dのインポート
まずはメイン機能である Anima2D を Unity の AssetStore からダウンロードしましょう。
[Unity Anima2D - アセットストア](https://www.assetstore.unity3d.com/jp/#!/content/79840)

次のようにインポートしたら準備完了です。実用例としてExampleフォルダもあるので参考にしましょう。

![Anima2Dのimport.png](https://qiita-image-store.s3.amazonaws.com/0/46088/15aa9354-9143-daf8-e28c-83998c326935.png)


#自作エディタ拡張 SCAnima2DHelper のインポート
次に、私が作ったエディタ拡張 SCAnima2DHelper のスクリプトを追加します。
Anima2D だけで十分という方は追加する必要はありません。

SCAnima2DHelper は github のLICENSE.txtのライセンスに従い自由にご利用できますが、自己責任でお願いします。
ダウンロードは次の github のリンクから行えます。

[github sakura-crowd/SCAnima2DHelper](https://github.com/sakura-crowd/SCAnima2DHelper)

ダウンロードした unitypackage をメニュー[Assets]＞[Import Package]＞[Custom Package]などから開きます。
下の画像のようなダイアログで import ボタンを押すと、プロジェクトに配置され、コンパイルされ、それぞれのメニューがエディタに追加されます。

![SCAnima2DHelperのインポート.png](https://qiita-image-store.s3.amazonaws.com/0/46088/15cfd053-5395-f570-e8cf-41cb65120622.png)

## SCAnima2DHelper の機能の紹介
SCAnima2DHelper の機能は2つあります。

(1) SpriteMeshアセットを複数いっきにシーンに追加するエディタ拡張
使うためには、プロジェクトウィンドウで SpriteMesh アセット群を選択したあとの右クリックメニューで
[Create]＞[SCAnima2DHelper]＞[Multi SpriteMesh Instantiate]
を選択します。

![SCAnima2DHelper01.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/78450557-b146-2009-c9b1-ae31e47a8e8f.gif)

(2) シーンに配置された特定の名前の SpriteMeshInstance を指定された位置にいっきに移動・表示順設定するエディタ拡張
使うためにはメニューの
[GameObject]＞[SCAnima2DHelper]＞[SpriteMeshInstance Layout]
を選択します。

![SCAnima2DHelper02.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/622aecdc-dc8f-f8f7-1dda-15a1df6bed8b.gif)

1番目のは、手動で SpriteMesh アセットを1つずつシーンに追加することで代替できます。
2番目のは、トリミング情報を手動でおぼえておき、それと PixelPerUnit で得られた座標を手入力することで代替できます。

#パーツ画像を準備する
まずは、アニメーションさせたい人物などの絵を描きます。

![アニメーション用の画像を用意.png](https://qiita-image-store.s3.amazonaws.com/0/46088/44f1c622-6d9a-2776-e89f-e94d86ba63b5.png)

実は Anima2D の勉強でかなり時間をさいたのが、素材の絵の作成です。
絵の描き方講座とかをみながら、なんとか描きました。
Anima2D の勉強という目的だけならば、フリー素材などを利用する方法のほうが楽かもしれません。

## お絵かきソフト
今回は [CLIP STUDIO PAINT PRO](https://www.clip-studio.com/clip_site/) で描いていますが、レイヤーを分けることができて、レイヤーごとに同じサイズで出力ができれば他のお絵かきソフトでも同じく利用できると思います。
例えば、 [Inkscape](https://inkscape.org/ja/) とかでも大丈夫だと思います。

## パーツごとにレイヤーを分けて描いて保存する
アニメーションで動かす必要のある部分ごとにレイヤーをわけて絵を描きます。
CLIP STUDIO PAINT PRO はレイヤーごとに簡単に出力する機能がなかったので、レイヤー１つだけを表示状態にしてエクスポートを繰り返しました。

![選択中のレイヤー以外をすべて非表示.png](https://qiita-image-store.s3.amazonaws.com/0/46088/d51bec85-3f2d-ce8f-41e3-c2bb96364734.png)

表示・非表示を切り替える目のマークの部分で右クリックすると、上記のメニューから「選択中のレイヤー以外をすべて非表示」が選べます。

![レイヤーごとに画像を統合して書き出し.png](https://qiita-image-store.s3.amazonaws.com/0/46088/72a8cbc7-27ff-f6d5-f563-4e3324a48533.png)

1つのレイヤーだけを表示したら、メニューの[ファイル]＞[画像を統合して書き出し]で画像出力します。

パーツ画像のファイル名は、最初に表示順番を描いておくと、エディタ拡張を使う際に便利だと思います。
今回は [miko-01.png], [miko-02.png] のように名前をつけました。
数値が小さいほうが手前にくるようにしています。

パーツ画像が２３個もあると、ちょっとしたストレスになる作業でした。
ここらへんも何とかもっと簡単にできるようにしたいです。

気合で、次のように23枚のレイヤーごとの画像を出力しました。

![レイヤーごとに画像を書き出した.png](https://qiita-image-store.s3.amazonaws.com/0/46088/75114179-2a90-36b6-3977-eebdf45d501b.png)

## トリミングしつつトリミング情報も得る
さきほど出力した23枚のレイヤーごとの画像の余白部分を除去してコンパクトにします。
このとき、どこからどこまでを切り抜いたかの情報を得ておくことで、エディタ拡張がそれに従いぴたっと配置してくれます。

トリミングを手作業でやりつつ、トリミング座標の情報をテキストに書いていくという方法でも可能ですが、相当しんどいと思います。

そんなとき [PL_ImageConstructor](http://p-lux.net/PL_ImageConstructor/) というゲーム制作向けの画像処理ソフトが大変便利です。(win版のみのようです。他のかたはすみません。)

さきほどのレイヤーごとの画像群を、ソフトのトリミングタブ内のリストに D&D などで追加し、トリミング情報の出力を [HTML] にして、実行します。

![PL_ImageConstructor で一括トリミング＆トリミング情報作成.png](https://qiita-image-store.s3.amazonaws.com/0/46088/9f386e05-2993-b937-60f2-aec4ce0d8d3b.png)

そうすると、トリミングされた画像群と、トリミングデータ.html が作成されます。

![トリミングしてトリミング情報も作成.png](https://qiita-image-store.s3.amazonaws.com/0/46088/05cf6ca1-6e51-cc34-f1ae-cb994d4ec5c7.png)

ちなみに、トリミングデータ.html は次のようになっていて、あとでエディタ拡張でコピペして、タブ区切りのテキストとして貼り付けて使います。

![トリミング情報をコピーして使う.png](https://qiita-image-store.s3.amazonaws.com/0/46088/3c9a35c7-ef08-b64c-d41c-8d5de4aa8a35.png)

# パーツ画像群をスプライトシートにまとめる
## ShoeBox について
以前に「[Sprite Packer/ShoeBoxを使ってUnityの描画を高速化する - Qiita](https://qiita.com/sakura-crowd/items/fb4b05db0fb38fc585e7)」でも紹介した [ShoeBox](http://renderhjs.net/shoebox/) という無料のソフトを使いました。

ShoeBox を使う利点として、「[ShoeBox Tools for Unity](https://assetstore.unity.com/packages/tools/sprite-management/shoebox-tools-for-unity-35760)」というツールでスプライトの読み込みを簡単に行えることがあります。

画像ファイルを Sprite として扱うだけならば Unity プロジェクトの Assets フォルダ以下に配置すればできますが、 Multiple にして、それぞれのパーツ画像に矩形を正しく設定することは面倒だし、正確に行うことはかなり難しいと思います。

そこで「ShoeBox Tools for Unity」で読み込むと、 ShoeBox がスプライトシートの画像と同時に出力する xml ファイルのとおりにパーツ画像の矩形を設定してくれます。

## ShoeBox の使い方
使い方は簡単で、 SpriteSheet と表示されている枠にパーツ画像のファイル群を D&D するだけです。

![ShoeBox.png](https://qiita-image-store.s3.amazonaws.com/0/46088/0a9a992d-00d1-56df-e451-481d3c411139.png)

成功するとパーツ画像をひとつの画像ファイルにまとめたスプライトシートの png とパーツ画像の配置データが記録された xml が出力されます。

![ShoeBox の出力.png](https://qiita-image-store.s3.amazonaws.com/0/46088/55151c38-0dfc-70fb-900e-ebe58f591512.png)



# スプライトシートをインポートしつつパーツごとに矩形設定をする
前述したように、「ShoeBox」を使ってスプライトシートを作った場合は、「ShoeBox Tools for Unity」を Unity にインポートして、それを利用して読み込むと、簡単にパーツごとに矩形設定された Sprite(Multiple) を得ることができます。

具体的にはimportした ShoeBox Tools for Unity の機能を [Assets]＞[ShoeBox Tools]＞[Imprt Sprite Sheet] メニューから選択し、ダイアログを表示し、先ほど作られた sprites.xml を読み込みます。

![ShoeBox メニュー.png](https://qiita-image-store.s3.amazonaws.com/0/46088/67b9a4be-4946-3aa1-92e6-9e0ba8e6e91c.png)

![ShoeBox Tools で sprites.xml を選択して spritesheet をインポート.png](https://qiita-image-store.s3.amazonaws.com/0/46088/52cb4c7c-b566-4625-f4a8-9d81aaf8ae3c.png)

そうすると、 Assets フォルダ直下に sprites という名前の Sprite(Multiple)型のアセットが作成されて、パーツ画像ごとに矩形でわけられています。

![spritesheet はきれいにパーツごとに矩形で分割されている.png](https://qiita-image-store.s3.amazonaws.com/0/46088/393623bf-a124-e17f-c85b-9409face99b3.png)

![spritesheet の作成直後.png](https://qiita-image-store.s3.amazonaws.com/0/46088/0cda4177-8876-5074-c883-772e50459977.png)

この sprites アセットは適当な名前に変更したりフォルダを移動してから使います。

# SpriteMesh を作成してエディタ拡張でシーンにいっきに追加する
作成した sprites アセットをプロジェクトウィンドウで選択したあと、右クリックメニューの [Create]＞[Anima2D]＞[SpriteMesh]を選択します。
※SpriteMesh を作る前に sprites の PixelPerUnit は設定してください。

![SpriteSheetの選択.png](https://qiita-image-store.s3.amazonaws.com/0/46088/2a34f93f-d199-5671-62f0-7aa38cb40c80.png)

![Anima2DのSpriteMeshメニュー.png](https://qiita-image-store.s3.amazonaws.com/0/46088/08f2a98c-3b7e-b194-2b4b-05228709a24f.png)

そうすると、パーツ画像ごとに SpriteMesh アセットが作成されます。

![SpriteMeshを作成したときのプロジェクトウィンドウ.png](https://qiita-image-store.s3.amazonaws.com/0/46088/66e1b10f-72b9-284f-1aa0-e358c63467ea.png)

この23個の SpriteMesh を1つずつシーンに追加するのは面倒なので、エディタ拡張を作りました。
使い方は、シーンに追加したい SpriteMesh アセット全てを選択してから、右クリックメニュー[Create]＞[SCAnima2DHelper]＞[Multi SpriteMesh Instantiate] メニューを選択します。

![Multi SpriteMesh Instantiateメニュー.png](https://qiita-image-store.s3.amazonaws.com/0/46088/9d8b6dd1-70dc-ea18-9fd9-31ee6d109c34.png)

そうするとシーンにいっきに SpriteMeshInstance が作成され配置されます。

![いっきに配置された.けどメッシュの一部に余計なものがはいっている.png](https://qiita-image-store.s3.amazonaws.com/0/46088/b13f3e98-6129-3c8a-65aa-b6253fbdd5b1.png)

しかし、画面をみるとわかるとおり、なにかパーツの周囲に細かな余計なものがついています。

このまま配置してしまうと、ノイズがまじったようなキャラクター画像になってしまいます。

![メッシュ調整前に配置した例.png](https://qiita-image-store.s3.amazonaws.com/0/46088/fc6fa16b-5484-13cb-de72-c6ccbaf390ee.png)

これはおそらく、 Anima2D で自動的にメッシュを作成した際に、周囲の別の画像パーツの一部も取り込んでしまった結果です。

![Anima2Dで自動的に作成したメッシュでは周囲のパーツ画像も取り込んでしまうことがある.png](https://qiita-image-store.s3.amazonaws.com/0/46088/18082255-6a83-30fa-53b8-1797876cc5b1.png)

これを Anima2D の SpriteMesh Editor 上の Slice 機能である程度きれいにできます。

![Slice機能によってメッシュを整える.png](https://qiita-image-store.s3.amazonaws.com/0/46088/f88ba034-175c-d1fb-2fae-0d70a8254f1b.png)

パラメータなどの設定によるかも知れませんが、 Slice 機能を使っても完全には余計なものが除去されないこともあります。

![SpriteMeshEditorのSliceでもメッシュに余計なものがはいることもある.png](https://qiita-image-store.s3.amazonaws.com/0/46088/8d128f98-345f-7f21-c5e4-1126a30c6354.png)

あとは、手動で不要な頂点を選択して削除したりしながら、メッシュを整えていきました。

![不要なメッシュの頂点を削除していく.png](https://qiita-image-store.s3.amazonaws.com/0/46088/5421e85b-53b4-19d5-8f3a-4053b0505f99.png)

これにより、次のように余計なノイズのようなものが除去されてシーンにパーツが表示されるようになりました。

![パーツ画像の余計な部分を除去したあと（ボーンはこの時点では本当ははいっていません）.png](https://qiita-image-store.s3.amazonaws.com/0/46088/eb3a905d-f5da-f424-659d-770e36c28f5b.png)
※上記のスクリーンショットは SpriteMesh にボーンを Bind したあとのものです。実際はシーンにあるようなボーンは表示されませんし、ヒエラルキーウィンドウの SpriteMeshInstance も下位にゲームオブジェクトを持ってはいません。


# SpriteMesh Editor でのメッシュの頂点編集について
手動で頂点編集した際に覚えたことを備忘録として書いておきます。

## SpriteMesh Editor の開き方
SpriteMesh Editor を開くには、

(1) プロジェクトウィンドウの SpriteMesh アセットを選択し

![SpriteMeshEditorの表示方法1.png](https://qiita-image-store.s3.amazonaws.com/0/46088/fdec7540-722e-7551-3e44-bbaf78386bc7.png)

(2) その SpriteMesh の inspector ウィンドウで [Edit Sprite Mesh] ボタンを押します。

![SpriteMeshEditorの表示方法2.png](https://qiita-image-store.s3.amazonaws.com/0/46088/285ffae3-a2f2-d8c3-9cfd-0560d9920a8c.png)

(3) 編集のあとは、 SpriteMesh Editor 内の Apply ボタンを押して確定・反映しましょう。

![SpriteMesh Editor の Apply ボタン.png](https://qiita-image-store.s3.amazonaws.com/0/46088/fed03e8d-5ef6-f9b7-ed24-2817f98fb9a1.png)


## 複数選択と頂点の削除
余計な頂点を削除したい場合、１つの頂点ならばその丸を左クリックして delete で OK です。
いっきに削除したい場合も、次の gif 動画のように一括削除できます。

* マウスの D&D で矩形選択をしたり
* 頂点を ctrl + 左クリックで追加選択できます。
* 複数選択した頂点の削除も delete キーです。

![SpriteMeshEditorで頂点を矩形選択や ctrl ＋左クリックで複数選択し delete で削除.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/017b4979-5472-809a-4a1c-d55aa0b0217a.gif)

## 頂点の追加と頂点の移動
頂点が足りない場合は次の gif 動画のように追加することができます。

* 頂点と頂点の間の線分の上で shiftキーを押しながら左クリックすると頂点を追加できます。
* 頂点は D&D することで移動するできます。

![SpriteMeshEditorで頂点を追加して移動させる.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/e695719e-0749-082e-dd62-ba8397841a33.gif)

## 線分をカットしたり途切れた頂点と頂点をつなぐ
頂点と頂点のつながりを削除したい場合や、頂点と頂点をつなぎたい場合は次の gif 動画のようにカットしたりつないだりできます。

* 頂点と頂点の間の線分を左クリックで選択したあと delete キーでカットできます。
* つなぎたい片方の頂点をドラッグ中に shift キーを押してつなぎたいもう一方のほうでドロップするとつなぐことができます。

![SpriteMeshEdtitor で線分を消したりつなぎなおす.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/8f728d21-08a5-8d24-dd26-e3a7e671e363.gif)


# トリミングデータとエディタ拡張を使ってぴたっと配置する
シーンに SpriteMeshInstance を配置したら、エディタ拡張を使って、一気に配置していきます。

エディタ拡張を使うために、[GameObject]＞[SCAnima2DHelper]＞[SpriteMeshInstance Layout]を選択します。

![SpriteMeshInstance Layout メニュー.png](https://qiita-image-store.s3.amazonaws.com/0/46088/741adaae-51f3-3687-e73f-a0ea2194b60b.png)


そうすると次のようなウィンドウが表示されます。ウィンドウサイズが小さい場合は調整してください。

![SpriteMeshLayoutウィンドウ.png](https://qiita-image-store.s3.amazonaws.com/0/46088/52006aa1-dd78-7771-5fef-072dca52198a.png)

あとは上のスクリーンショットのようにテキストエリアに、さきほどのトリミングデータ.html をコピーして貼り付けます。（最初のヘッダーは除いてコピペしてください）

![トリミング情報をコピーして使う.png](https://qiita-image-store.s3.amazonaws.com/0/46088/3c9a35c7-ef08-b64c-d41c-8d5de4aa8a35.png)

PixelPerUnit には画像の PixelPerUnit を設定します。
SeparatorChar は変更しないでかまいません。区切り文字を変えた場合は適宜変更してください。

設定が済んだら Layout ボタンを押すと、いっきに配置され、表示順も設定されます。

![レイアウト配置後(カメラを少し移動しました）.png](https://qiita-image-store.s3.amazonaws.com/0/46088/53e311bf-a6f1-6d90-6a3b-472436be90fe.png)

表示順は SpriteMeshInstance の Order In Layer が設定され、トリミングデータの上の行から順に -1, -2, -3 と設定されます。

![SpriteMeshゲームオブジェクトの下位へ配置.png](https://qiita-image-store.s3.amazonaws.com/0/46088/b7767d9f-7341-8ad6-c483-c8a20de21a28.png)

あとは、適当なゲームオブジェクトの下に SpriteMeshInstance を配置して、ボーンの設定などをはじめましょう。
上のスクリーンショットでは、 CreateEmpty で作った座標(0,0,0)の Miko, SpriteMesh ゲームオブジェクトの下位に配置しました。



#参照リンク

* [Anima2D](https://www.assetstore.unity3d.com/jp/)
* [Unity](https://unity3d.com/jp)
* [github sakura-crowd/SCAnima2DHelper](https://github.com/sakura-crowd/SCAnima2DHelper)
* [CLIP STUDIO PAINT PRO](https://www.clip-studio.com/clip_site/)
* [Inkscape](https://inkscape.org/ja/)
* [PL_ImageConstructor](http://p-lux.net/PL_ImageConstructor/)
* [Sprite Packer/ShoeBoxを使ってUnityの描画を高速化する - Qiita](https://qiita.com/sakura-crowd/items/fb4b05db0fb38fc585e7)
* [ShoeBox](http://renderhjs.net/shoebox/)
* [ShoeBox Tools for Unity](https://assetstore.unity.com/packages/tools/sprite-management/shoebox-tools-for-unity-35760)