VRoidから生成したVRChat用アバターのパラメータ再設定（DynamicBone含む）を自動で行う

2022.07.16
VRChatのPhysBoneアップデートにあたり、PhysBonesに対応した記事を以下に書きました。
https://qiita.com/shoshoi/items/256eef287d476c8acd3d

# はじめに
私のVRChat用アバターは、[VRM Converter for VRChat](https://booth.pm/ja/items/1025226)でVRoidモデルから変換して生成しています。

VRoidモデルを使用している場合、衣装変更や髪型変更などVRoid側で修正を加える度にモデルの再変換および各種パラメータ（View PositionやDynamicBone）の再設定をする必要があり、時間のかかる作業となります。

そこで、View PositionやDynamicBoneなどのよく再設定するパラメータを、設定済みのアバターから自動でコピーするためのUnityEditor拡張である「VRoidAvatarSetupUtils」を作成しました。

この記事ではその使用手順を説明します。

# 注意事項
- 必ず事前にプロジェクトのバックアップを取ってください。
- パラメータ設定済みのアバターとパラメータ再設定対象のアバターでボーン構造・ボーン名称が異なる場合、DynamicBone、DynamicBoneColider、およびオブジェクトを正常にコピーできません。
- 本手順で発生した如何なる問題に対してshoshoiは責任を負いかねます。

# パラメータのコピー手順
この記事では、Unity 2019.4.29f1とVRChat SDK3-Avatarsを使用して手順を説明します。Unity 2018.4.20f1とVRChat SDK2を使用する場合、画面が若干異なりますが手順は同じです。

## 作業の前提
- プロジェクトのバックアップをとっていること
- VRChat SDK2 または VRChat SDK3-Avatarをインポートしていること
- DynamicBoneをインポートしていること

## アバターの準備
パラメータ設定済みのアバター（以降コピー元アバター）と、パラメータ再設定対象のアバター（以降コピー先アバター）を準備します。VRoid（VRM）をVRChatアバターに変換するまでの流れは、以下の記事を参照ください。

VRMからVRChatへアップロードする流れ - Qiita
https://qiita.com/100/items/7315fe3a7eb75732ae43

## VRoidAvatarSetupUtilsの導入
1. 以下のURLから最新版（右上の赤いボタン）を入手します。  
https://jirko.booth.pm/items/3232745
2. ダウンロードしたファイルを展開（解凍）します。
3. 中に入っている**unitypackage**ファイルを、**Assets**にドラッグ＆ドロップし「import」します。
![new_capture1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945857/286c3e31-4e4f-1928-0aeb-1d9ae84e5c35.png)


## パラメータのコピー
VRoidAvatarSetupUtilsでパラメータのコピーを行います。VRoidAvatarSetupUtilsの設定項目の詳細は、後章**[VRoidAvatarSetupUtils 設定項目の詳細](#vroidavatarsetuputils-設定項目の詳細)**を参照ください。

1. 上の**VRoidAvatarSetup**メニューから**Open CopyAvatarParameters Wizard**を選択します。
![new_capture2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945857/9c762ef7-5344-eaa8-6e55-25b3965bfa66.png)

2. ダイアログウィンドウが開くので、Source Avatarにコピー元アバターを、Destination Avatarにコピー先アバターをそれぞれヒエラルキーからドラッグします。
![new_capture3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945857/2562b44f-8fef-40fb-be40-bfe0ae391f9b.png)

3. ウィンドウ下部の**Copy**ボタンを押下します。
![new_capture4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945857/38a37e23-6fd7-30f7-8ae5-4c708df4639f.png)

4. 正常にコピーが完了すると、**Copy**ボタンの下に「コピーが完了しました」を含むメッセージが表示されます。
![new_capture5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945857/10a88c70-5f40-b938-3038-b056536ac779.png)

以上で手順は完了です。

# VRoidAvatarSetupUtils 設定項目の詳細
VRoidAvatarSetupUtilsの設定項目は以下のとおりです。

## VRC Avatar
- Source Avatar
コピー元アバターを設定します。

- Destination Avatar
コピー先アバターを設定します。

- Avatar Type
アバターのタイプを選択します。VRoidから変換して生成したアバターを使用している場合は「VRoid Avatar」を、それ以外の場合は「Other Avatar」を選択してください。

## VRC Avatar Descripter
- View Position
View Position（アバターの視点位置）の値をコピーします。

- Eye Movements（VRChat SDK3-Avatar限定）
Eye Movements（目の動きの傾向）の値をコピーします。

- Rotation States（VRChat SDK3-Avatar限定）
Rotation States（目の回転範囲）の値をコピーします。

## Pipeline Manager
- Blueprint ID
Blueprint ID（アバターに付与される一意のID）の値をコピーします。

## Dynamic Bone
### Dynamic Bones
#### Avatar TypeがVRoid Avatarの場合
以下の項目からコピーしたいダイナミックボーンを選択してコピー先アバターへコピーします。全てのDynamic Boneをコピーする場合、全て選択してください。

- 髪の毛
ルートボーン名に「Hair」が含まれるDynamic Boneをコピーします。

- スカート
ルートボーン名に「Skirt」が含まれるDynamic Boneをコピーします。

- 袖
ルートボーン名に「Sleeve」が含まれるDynamic Boneをコピーします。

- 胸
ルートボーン名に「Bust」が含まれるDynamic Boneをコピーします。

- その他
上記以外のDynamic Boneをコピーします。

#### Avatar TypeがOther Avatarの場合
- コピー元アバターに設定されている全てのDynamic Boneをコピー先アバターへコピーします。
- コピー実行前に、コピー先アバターに設定されていたDynamic Boneは削除されます。

### Dynamic Bone Coliders
- コピー元アバターに設定されているDynamic Bone Coliderをコピー先アバターへコピーします。
- コピー実行前に、コピー先アバターに設定されていたDynamic Bone Coliderは削除されます。

## Objects
- アバターに配置されているオブジェクトをコピーします。
- コピー元アバターとコピー先アバターのオブジェクト構造の差分を比較し、「コピー元に有りコピー先に無い」オブジェクトをコピーします。
- コピー元アバターとコピー先アバターのボーン構造が違う場合、ボーンが差分として検出されコピーされる恐れがあります。