VRoidとStableDefisionForUnityを使ったキャライラスト作成のワークフロー

# 概要
個人でゲーム製作する際、またはゲーム作りたいけど絵を描くのが苦手という際に使用できるかなと思うワークフローの紹介です。
実際の用途は2DベルトアクションゲームのインゲームのキャラクターをSpineで動かす際のイラストに利用しましたが、他にもいろいろ応用が利くものかと思います。

主なフローとしては以下のようになります。
1. VRoidで生成したいイラストに近いモデルを用意
1. Unityに作成したモデルをインポート
1. Unityでモデルにポーズ、またはアニメーションをつける
1. StableDefisionForUnityでポーズを付けたモデルもしくはアニメーションさせたモデルとデプスを基にイラストを生成する

# 環境・導入
### 前提知識
- ある程度Unity触れる
- ある程度StableDiffusionWebUIとControllNetの使い方が分かる

### 必要なもの
- Unity2021もしくは2022 （StableDefisionForUnityを使うため）
- StableDiffusionWebUI+ControllNet （イラスト生成するため）
- VRoidStudio （モデルを作成するため）

### Unityに必要なもの
- StableDefisionForUnity1.4.0
- UniVRM-1.0 （VRoidのモデルをインポートするため）


### 導入方法
UnityとStableDiffusionWebUI+ControllNetに関してはいくらでも記事あるので各自調べてください。

StableDefisionForUnityとUniVRM-1.0は公式ドキュメントがあるので基本的にそちらをご覧ください。
https://docs.witchpot.com/
https://vrm.dev/univrm1/

VRoidStudioはダウンロードしてインストールするだけです。
https://vroid.com/studio

### 躓いたところ
StableDiffusionForUnityを導入した際にCドライブの所定のフォルダにStableDiffusionWebUIがプリインストールされるが、Externalモードでもこのフォルダのファイルを使用するため、削除すると永遠にサーバーが起動できないので削除しないように我慢する。

Edit > Preferences > StableDiffusionForUnityで導入済のStableDiffusionWebUIのdatファイルを指定するが、datファイルを編集してAPI叩けるようにしないと永遠にサーバーが起動できない。一応ドキュメントに書いてあるが見落としがち。

### 設定

Assets\Plugins\Witchpot\Packages\StableDiffusion\Runtime\Settings\StableDiffusionWebUISettingsの設定ファイルでモデルとか色々指定するがサーバー起動後だとListModelsボタンを押せば自動で取得してくれる。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054619/dde10d65-5b73-4cc1-ad72-ea820c872da4.png)

StableDiffusionWebUISettingsを設定するとControlNetのモデル順もかわるので同じディレクトリにあるDepthとかNormalとかのポスプロ用の設定ファイルのControlNetのモデルを正しいものに設定し直す。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054619/a8038bce-f57f-482d-8762-855656243ed5.png)

# 生成
### 1.VRoidで生成したいイラストに近いモデルを用意
VRoidStudioでは自由度高めのキャラクターを作成できます。衣装の部分はテクスチャのAlphaがそのまま反映されるので手軽に形を変えられます。モデルをそのまま使用するにはクオリティーが気になりますが、イラスト生成に使う分には十分かと思います。
モデルはVRM1.0でエクスポートします。

テストで作成したモデル。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054619/4b6923c2-e974-4eb5-a59f-0d70eeeaeb84.png)

### 2.Unityに作成したモデルをインポート
エクスポートしたモデルを環境を整えたUnityにインポートします。Unityのプロジェクトはイラスト生成専用のものを用意しておくといいかもです。RenderPipelineはURPにします。

UnityにインポートしたモデルはデフォルトのMaterialのShaderがBuilt-In向けになっているので、VrmScriptedImporterのインスペクターからRenderPipelineをUniversalRenderPipelineに変更します。

### 3.Unityでモデルにポーズ、またはアニメーションをつける
VeryAnimationなどツール使うと楽です。
また生成時にControllNetでDepth使用するので、カメラのNearFarをぎりぎりキャラクターが収まる範囲に設定し、Depthがはっきり出るようにします。

テストで用意したポーズ。
<table>
<tr><th>3Dキャプチャ画像</th></tr>
<tr><td>
<img width="180" alt="Sotai.png (291.5 kB)" src="https://img.esa.io/uploads/production/attachments/20391/2024/03/05/147648/f85047d2-a511-4457-9047-76bc2778e448.png"><img width="180" alt="Sotai.png (298.5 kB)" src="https://img.esa.io/uploads/production/attachments/20391/2024/03/05/147648/7d8ccd93-f202-45a6-b788-3eb27b50baff.png"><img width="180" alt="Sotai.png (346.0 kB)" src="https://img.esa.io/uploads/production/attachments/20391/2024/03/05/147648/f8837305-ce30-4d6d-9bae-88c7f94250b8.png">
</td></tr>
</table>

### 4.StableDefisionForUnityでポーズを付けたモデルもしくはアニメーションさせたモデルとデプスを基にイラストを生成する
Img2ImgForControlNetでDepthを使用し生成する。
解像度は1024x1024。
プロンプトはハイクオリティだけ。
使用モデルは以下のもを使用。
- https://civitai.com/models/51057/aice-or-kawaice
- https://civitai.com/models/141122/raesanmix


<table>
<tr><td>aiceKawaice（画像Waight0.8）</td></tr>
<tr><td>
<img width="180" alt="aiceKawaice_0.8.png (506.1 kB)" src="https://img.esa.io/uploads/production/attachments/20391/2024/03/05/147648/1370520b-a50c-4d42-b5d0-4bea35c4b139.png"><img width="180" alt="aicekwaice_0.7.png (599.9 kB)" src="https://img.esa.io/uploads/production/attachments/20391/2024/03/05/147648/5141527e-aaf7-4bfb-ab36-19ae255b4575.png"><img width="180" alt="aicekwaice_0.7.png (629.3 kB)" src="https://img.esa.io/uploads/production/attachments/20391/2024/03/05/147648/a35cafa0-cfc7-4762-89f3-a4d69242d573.png">
</td></tr>

<tr><td>aiceKawaice（画像Waight0.2）</td></tr>
<tr><td>
<img width="180" alt="aiceKawaice_0.2.png (388.6 kB)" src="https://img.esa.io/uploads/production/attachments/20391/2024/03/05/147648/46dd6107-3b98-449a-9ca3-c0f5e2853689.png"><img width="180" alt="aicekwaice_0.2.png (478.9 kB)" src="https://img.esa.io/uploads/production/attachments/20391/2024/03/05/147648/b19976e5-3e03-464c-af90-8dce790adc17.png"><img width="180" alt="aicekwaice_0.2.png (515.6 kB)" src="https://img.esa.io/uploads/production/attachments/20391/2024/03/05/147648/e6987260-211d-462c-a2ab-7f3c98dad99d.png">
</td></tr>

<tr><td>raesanmix（画像Waight0.8）</td></tr>
<tr><td>
<img width="180" alt="raesanmix_0.8.png (469.0 kB)" src="https://img.esa.io/uploads/production/attachments/20391/2024/03/05/147648/53210d7b-b76f-4159-8639-40d8705c3fc7.png"><img width="180" alt="raesanmix_0.7.png (461.8 kB)" src="https://img.esa.io/uploads/production/attachments/20391/2024/03/05/147648/705f6592-8aca-4a51-986b-a96f23437286.png"><img width="180" alt="raesanmix_0.7.png (573.1 kB)" src="https://img.esa.io/uploads/production/attachments/20391/2024/03/05/147648/b63302a7-4555-4f04-953e-358ad22f5865.png">
</td></tr>

<tr><td>raesanmix（画像Waight0.2）</td></tr>
<tr><td>
<img width="180" alt="raesanmix_0.2.png (436.3 kB)" src="https://img.esa.io/uploads/production/attachments/20391/2024/03/05/147648/e2976f5c-9db4-48e7-a6e7-081f3de9b890.png"><img width="180" alt="raesanmix_0.2.png (912.9 kB)" src="https://img.esa.io/uploads/production/attachments/20391/2024/03/05/147648/987a0c64-eb3b-457e-b58a-652dd86502f6.png"><img width="180" alt="raesanmix_0.2.png (1.2 MB)" src="https://img.esa.io/uploads/production/attachments/20391/2024/03/05/147648/40ee81b9-7fef-4d9e-aec3-9c4cf081e57e.png">
</td></tr>

</table>

# まとめ
通常のイラスト生成でControllNetのDepthでは画像からDepthを生成して使用するのに対し、この方法ではDepthは実際のDepthを使用しているのでいろんなポーズでも安定した画風やディテールで生成できると思います。
作成しているゲームでも使用していて、それを使用したSpineは下記になります。
https://ccmy.work/spine/12.html