Unity/VRChatにロボット系3Dモデルをインポートして動かす全行程



![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) ロボットタイプの3DモデルやCADをアバターとしてVR空間に送る際のプロセスとコツをまとめました。

# この記事のターゲット
ロボットタイプのメカ系自作3DモデルやCADを持っているけれど、まだ画面上で動かしたことがない、という方向けのまとめです。
ロボット系の3DモデルをBlenderとUnityを経由してVRChatにインポートして動かせるところまでを紹介していきます。
導入途中でUnityでも少し動かします。
各ツールの使い方についても最低限ですが触れていきますので、この記事だけでアップロードまでいけたらいいなーと思います。

ヨロイ型や昆虫型の外骨格っぽいアバターにもちょうどよいと思います。
通常の人型タイプのアバターをこれから初めてアップロードするという方にも役立つかもしれません。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/c85218b0-4e09-7f6b-20c3-b8da19365b78.png">
自分もなんとかアップロードできたので、工程を忘れないうちにメモしています。


# 準備物
* ロボット系の自作3Dモデル
* お使いのCADソフト
* Unity（ゲーム制作プラットフォーム）
* Blender（3Dモデリングツール）
* Windows機（VRChatはMacに未対応）

※VRChat SDKを使いアップロードする場合、Unityのバージョンは2018 4.20f1のみ対応です。[VRChat公式 Currently Supported Unity Version](https://docs.vrchat.com/docs/current-unity-version)（2020.12.26追記）
※BlenderはバージョンによってUIが大きく異なります。当記事では2.82aを使っています。


# 基本用語
ここで使われる基本用語の解説です。

* アバター：うごかしたいフィギアのことです。
* メッシュ：アバターの肉体を描画しているポリゴンのことです。
* ボーン：　関節を構成する骨のことです。この骨にメッシュを追従させてアバターを動かします。

# 工程の全容
3Dモデルの準備、Blenderでの作業、Unityでの作業と大きく３つの工程があります。

##### モデルを準備する工程
[01] 3Dモデルを用意する（※モデルを作成するところは今回解説しません）
[02] 3Dモデルをユニット単位で分割し、ととのえる
[03] ファイル形式.fbx等で書き出す

##### Blender上での作業
[04] Blenderに前述のファイルを読み込み、ポリゴン数を確認する
[05] Blenderでボーンを作成し、ボーンの親子関係を決める
[06] Blenderでボーンとメッシュを関連づける
[07] ファイル形式.fbxで書き出す

##### Unity/VRChatSDK上での作業
[08] Unityにインポートする
[09] UnityにVRChatSDKを導入する
[10] Unity上でモデルをVRChat用にととのえる
[11] モデルをVRChatにアップロードする
[12] 動作確認する

では早速作業をしていきます。

# [01] 3Dモデルを用意する(T字ポーズ)

動かす3Dモデルは、競技用ロボットの3DCADでも、ガンダム系オリロボの3Dモデルでも大丈夫です。
粘土をこねて作ったようなモデルを動かす場合についてはここでは説明しません。（若干工程が異なります）

### やること 01.1
>作成済みの3Dモデルを普段お使いの3Dソフトで立ち上げます。
>
>ロボットがヒューマノイドタイプの場合には足を伸ばして両腕を横に広げた「T字ポーズ」にしておきます。T字にしておくことが大事です。
><img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/28969b34-ff07-db71-ff0d-00dbe7770636.png">
>（ちなみに自分がメインでつかっているSketchUpの無料版はobjもfbxもstpも出力できません。stlはかろうじてプラグインで出力できます。そういう環境でもなんとかなりました。）

### やること 01.2(2020.12.27追記)
3Dモデルの方向をBlender/Unityに合わせます。
>
>アップロード直前のUnity上でY軸が上になっている必要があります。
>Unityの一歩手前の作業をBlenderで行うわけですが、モデルをBlenderに読み込んだ時点でそのまま直立して表示されるよう、最初の3Dモデルの時点で回転させておくと混乱を減らせるかと思います。
>
>3Dモデルのファイル書き出し後の軸方向変化はお使いのソフトによってマチマチかもしれないので、軸方向をデフォルト状態のままエクスポートして次以降のステップに進み、Blenderへのインポート時に軸がどう変化するのかを先に確認してしまうのが手取り早いかもしれません。確認後にこのステップに戻り、Blenderで直立するようにあらかじめ3Dモデルを回転させてからエクスポートしなおせばOKです。
>余談ですが、3Dモデルの座標系は製図やグラフ出身のCAD系のものとディスプレイ表示出身のCG系のものに分かれており、立体物のxyz軸の方向に違いがあります。

# [02] 3Dモデルをユニット単位で分割し、ととのえる

ロボット系のモデルを動かす際に扱いやすいよう調整していきます。
ロボット系モデルで特にキモとなる作業で、他の記事ではあまり説明されていません。

* メッシュを一緒に動く塊ごとにまとめ、必要な隙間を設ける。
* データが軽くなるようにポリゴン数を削減する

という調整を行います。

お手持ちのモデルはCAD上で部位ごとにグルーピングがなされていると思いますが、当プロセスにおいては最終的に**グルーピングをすべて解除した状態**でBlenderに持ち込みます。
後でBlenderで作業する際、グルーピングのかわりに、隣接する頂点のまとまりを選択する「島選択」というショートカットを何度も使うことになるのですが、その作業がラクにできるよう、この時点で下ごしらえをしておくというわけです。
また、リアルタイムで動かすにはデータが軽量なほどよいため、ポリゴンの削減もこの時点でおこなっておきます。
VRChatではPCで70,000ポリゴン、Quest対応で5,000(~10000ぐらい？)というポリゴン数の上限があります。

### やること 02.1
必要な隙間をつくります。
>3Dモデルがパーツごとにグルーピングされたまま状態で、稼働箇所すべてのパーツについて、密着させずに隙間を設けます。
たとえば、ガンダムタイプの腕であれば、下図のようなイメージです。
隙間の大きさはデータ的な隙間さえあれば極限まで小さくても大丈夫のはずですが、数値に迷ったら0.1mmでよいと思います。
><img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/030195e8-11ba-4f89-6f3a-0021ed788585.png">

### やること 02.2
ここでポリゴン数を減らす工夫もしておきましょう。
ご存知の通りポリゴンでは全ての面を３角形に分割します。
たとえば頂点が4つの長方形は２つの三角形に分割されたデータとなります。

この特性を理解して、元の形状はなるべく変えずに、ポリゴン数を減らしていく作業をしていきます。
以下は自分が気づいたポリゴン数削減のコツです。
>##### 円形の分割数をおおざっぱにする
たとえば120角形を24角形にしたり、もしくは思い切って削除してしまいます。

>##### 一体となっているユニットでも、面上になるべく他の面を密着させず浮かせる
たとえば図のように２つの直方体を組み合わせたような形状の場合、密着しない場合は24ポリゴンで済みますが、密着させると30ポリゴンになってしまいます。
><img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/8d22325b-4f58-1fb8-d984-ca83a6fade26.png">
>特に円形は平面に密着させることで円の内外にポリゴンを大量発生させます。隙間を開けることは大きなポリゴン削減につながります。
>#####部位の注目度によって情報の密度を変える
>たとえば顔のディテールはなるべくキープしつつ、その分、腕やスネなどあまり注目されない部分は簡略化してしまうのも手です。密度にメリハリをつけることで、全体からうける印象をキープしつつポリゴンを減らしていけます。
>
>##### グルーピングの解除
上記が整ったところで全てのグルーピングを解除します。
>
>*【注】上記のパーツを分割する手法だと激重になるはずだという旨のご指摘をいただきました。**手元のモデルは非常に軽快に動いている感じなのですが、内部的に何か大きな負荷をかけているのかもしれません。現在調べています。（2020.12.25追記）
メッシュが離れていてもグループさえ一緒であればマテリアルスロットの呼び出しは増えない（負荷増大にはならない）という説もあるようです。（2020.12.26追記）*

# [03] ファイル形式.fbx等で書き出す

3DモデルをBlenderで読み込める形式でエクスポートします。

### やること 03.1
>お使いの3DCADソフトで上記のファイルを.fbx形式でエクスポートします。
>##### ※CADソフトが.fbx形式のエクスポート対応していない場合
たとえばSketchupであれば、一旦Unityで.skpファイルを読み込んだ後に.fbxをエクスポートするという方法が使えます。その場合、FBX Exporterのアドオンを使い、ExportformatはASCIIではなくBinaryを選びます。
>
>Fusion360を経由するのもよいと思います。ほとんどのCADデータのインポートに対応しているので、いちどFusion360に読み込んでしまえば、.fbxや.objなどの形式での出力ができるようになります。（2020.12.27追記）
>参考）[Fusion 360にインポートすることができるファイル形式](https://knowledge.autodesk.com/ja/support/fusion-360/learn-explore/caas/sfdcarticles/sfdcarticles/JPN/File-formats-supported-by-Fusion-360.html?st=Fusion360%20%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88)
>参考）[Fusion 360でエクスポートすることができるファイル形式](https://knowledge.autodesk.com/ja/support/fusion-360/learn-explore/caas/sfdcarticles/sfdcarticles/JPN/How-to-export-a-design-in-Fusion-360.html)
>
>また、この段階でのエクスポートと次のインポートは**objなど他の形式でもよい**かもしれません。stlはパーツが一つずつしか出力できないらしく、今回は不向きと思われます。
>.fbxで書き出すと一つのファイルにマテリアルも付いてきてラクです。

# [04] Blenderに読み込み、ポリゴン数と直立方向を確認する

ここからBlenderでの作業になります。
まずBlenderに.fbxの3Dモデルをインポートし、モデルの状態を確認しましょう。
必要に応じて前の工程にもどり修正を施していきます。
BlenderのUIは初めて使う方にはかなり独特なものに感じられると思います。基本的な使い方については他のサイトや記事、動画等で調べていただくのが近道かもしれません。

### やること 04.1
モデルをBlenderにインポートします。
>Blenderを立ち上げます。新規ファイルの画面が出ます。
><img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/52cf0025-d64a-9a8c-44c0-76d8ea65533a.png">
中央に表示されているキューブは不要なので削除します。
左上あたりにあるモード切り替え表示が「オブジェクトモード」になっていることを確認し、中央のキューブを選択、xキーを押し「削除」でOKです。これで何もない画面になります。
>
>次に、先ほど作成した.fbxファイルを読み込みます。
画面最上部のメニューから「ファイル」→「インポート」→「FBX(.fbx)」等とし、準備したファイルを選択します。
><img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/3110cbf8-6d15-9067-ff48-429f442436e6.png">

### やること 04.2
インポートした3Dモデルの情報を確認し、必要に応じて修正を加えていきます。
>3Dモデルが読み込まれると、画面の最下段右側に「頂点」「面」といった情報が表示されます。この「面」がポリゴン数となりますので、現段階でのデータサイズがわかります。
><img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/586d3e21-a951-2b7e-88a6-9321c5f273ef.png">
>数値が高すぎる場合には、前の工程にもどり、データ削減を行う必要があります。
個人的感覚になりますが目安としてVRChatPC版やUnity用ならだいたい30,000以下ぐらい、VRChatQuest版なら7,000以下（規定では5,000以下）を目指すのがよいと思います。VRChatではポリゴン数の評価は段階的(Excellent〜Very Poor)になっており、推奨値を少し超えるぐらいであればアップロード自体は成功するようです。もちろん軽ければ軽いほど自分も周囲も快適になります。

### やること 04.3
インポートした3Dモデルの垂直方向が今後のエクスポートに都合のよい状態であるかを確認します。
>右上にxyz軸の方向表示や回転を担う「ギズモ」と呼ばれるアイコンがあります。
><img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/b93e124d-7167-2594-b1ae-f9e9d321f1a7.png">
ギズモを参考に、ロボットがz軸方向に垂直に立っているかを確認します。基本的に両足の裏面はxy平面に接する（z方向に0になる）ようにします。
Blenderの操作に慣れている場合にはこの画面で位置を調整してもよいですし、Blenderの使い方を覚えたくない場合には前工程[03]の段階であらかじめモデルの方向を回転させてから.fbx等のエクスポート→インポートを行うというのも手です。
Blenderへのインポート時の設定で方向を変更できるようであればその操作で対応しても大丈夫です。


### やること 04.4
法線を合わせます。
法線というのは面がどちらの方向を向いているかという情報です。Blenderでは「ノーマル」と呼びます。同じ平面上でも法線がバラバラだと最終出力したときにモデルが透けたり色が変になったりします。

>まず法線を表示させます。
>右上の「オーバーレイ表示」のメニューから、下の方にある「ノーマル」の項目の「面の法線を表示」のアイコンをチェックします。
><img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/80776a6d-69cf-99b6-ff67-d425426fc150.png">
>次に法線を揃えます。
>編集モードでメッシュを全選択（aキー）し、上のメニュの「メッシュ」から「ノーマル」→「面の向きを外側に揃える」を選択します。一度で揃わない場合は何度かこれを繰り返します。
><img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/934d2b58-5e40-dc31-3aba-b9dc325629de.png">

### やること 04.5
平面の様子がフラットにならずポリゴン分割線に沿って変な影のグラデーションができる場合があります。気になる場合はこれも修正してしまいましょう。
>メニューの「メッシュ」→「シェーディング」から、「面をフラットに」「辺をシャープに」「頂点をシャープに」を選んで揃えるとスッキリします。
「面をスムーズに」などで揃えても良いかもしれません。（未検証）
><img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/cb22e0af-1f5a-29de-fd15-eb4d040dc541.png">

# [05] Blenderでボーンを作成し、ボーンの親子関係を決める
UnityやVRChatで3Dモデルを動かす場合には、まずボーンとよばれる骨をつくり、その骨にメッシュが追従するように設定しておく必要があります。
ボーンが踊るような指示を出せば、肉体であるメッシュもボーンに追従して一緒に踊るというわけです。
人型のボーンには基本となる共通のポイントが設定されているため、その基本形を守っておけば、既存のモーションを自作のロボットにも当てはめることができます。
ここではボーンをゼロから作成していきます。

### やること 05.1
最初のボーンを設置します。
>ギズモのYを押すと平面図のようになります。
ギズモアイコンの下にあるルーペアイコンや手のひらアイコンを使って、ロボットが画面にちょうどよく収まるようにします。
>
>次に「オブジェクトモード」の状態でShift+Aを押し「アーマチュア」を選択します。
すると画面上には三角形のクサビのようなボーンが１本生成され、右上のシーンコレクションには「Armature」が追加されます。
また、左上あたりのモード切り替えメニューから「編集モード」を選ぶと、その右側に「アーマチュア」の項目が出るようになるので確認しておきましょう。
><img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/b18583de-887d-3952-6517-335087f77d0c.png">
>先ほど作成した最初のボーンを核として胴体と足を継ぎ足していくので、まずボーンを腰の位置に移動します。
>
>オブジェクトモードでボーンを選択し、編集モードにします。改めてボーンの棒の部分を選択します。
この時、右のウィンドウのオレンジアイコンの欄（オブジェクトプロパティ）の「ビューポート表示」で「最前面」をチェックし、モデルの内部に埋もれたボーンも常に見えるようにしておきます。
>
>ボーンを移動します。ボーンを選択した状態でgキーを押すとボーンの位置を移動できるようになり、クリックかReturnキーで決定します。
ボーンの太い方が根元になりますので、根元の点が股関節の中心ぐらいになるように調整します。
gを押した後でx,y,zのキーのどれかを押すと、移動方向の軸を任意の方向に固定することができます。
>
>編集モードでボーンの細い方の頂点を選択した状態でgキーを押せば、ボーンのサイズを変更することができます。
（ボーンのサイズを変更する場合にはsキーで変更できますがここでは使いません。）
>
>**ボーンを追加していく場合には、編集モードでボーンの頂点を選択した状態でShift+E**を押します。こうしてボーンを継ぎ足してロボットの形に合わせていきます。

ヒューマノイドタイプの必須ボーンは以下のようになります。
こちらを参考にボーンを継ぎ足していくとよいでしょう。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/b9ba4c15-2e80-26d6-79e2-79b421909753.png">
右側の人体図は.fbxをUnityにHumanoidタイプでインポートした時に現れるデフォルトのボーンアサイン画面です。
**特に腰部(HIP)と胸部(CHEST)はVRChat用として使う際に必須となるので必ず設定**しましょう。

### やること 05.2

ボーンの中心および右(もしくは左)側分を先に作成します。

>まず、腰部（作成済み）から 脊髄 → 胸部 → 首部 → 頭部とボーンを伸ばしていきます。(Shift+E)
>
>次に、胸部ボーンの先端から右肩→右上腕→右前腕→右ハンドと伸ばします。
指も加えたい場合には、ハンドから2関節から3関節分の指を追加します。
>
>最後に、腰部から右大腿→右下腿→右フット→(必要に応じてつまさき)とボーンを継ぎ足します。
>
>移動のgキーやボーン追加のSHIFT+E、移動方向の固定ができるgキー後のx,y,zキー、ギズモのx,y,z面切り替えなどを利用すればうまくいくと思います。

人体のボーンをゼロから作るというと面倒な感じがありますが、実際やってみると基本形であればサクッとできてしまいます。

### やること 05.3
右側のボーンができたらボーンの親子関係を設定します。
ボーンの先端からボーンを伸ばしている場合には、親子関係は自動的に紐付けられます。
><img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/88e99749-477e-0300-2091-8451d082ac82.png">
右側のシーンコレクションのArmatureの中に、ボーンの親子関係が示されています。
全てのボーンは「腰部」から接続されている必要があるので、意図通りに接続できているか確認し、必要に応じて調整します。

>###### 親子関係を新たに設定する場合
>編集モードで「親ボーン」 → 「子ボーン」の順でShiftを押しながら選択します。
>「アーマチュア」→「ペアレント」→「作成」で紐付けができます。
>
>###### 親子関係を解除する場合
>編集モードで「アーマチュア」→「ペアレント」→「クリア」で関係を解除できます。
「親子関係をクリア」と「コネクトを解除」を選べます。「親子関係をクリア」をとすると完全に切り離されます。「コネクトを解除」の場合は親子関係を保ったまま接続点を切り離すことができ、位置をオフセットできます。

### やること 05.4
もう半分のボーンを自動作成します。すこし下準備があります。
>まずボーンの名称を設定します。
右側のシーンコレクションのボーンを選び、ボーンに名前をつけていきます。名前のテキストのダブルクリックし、L_UpperLegなどのように名前を変更していきます。L_とつけることで、それが左半身のパーツであるとBlenderに認識されるようになります。
>
>次に左半身を自動生成します。
>「編集モード」でボーンを全選択（ボーンを1つ選んでからaキー）し、メニューで「アーマチュア」→「対象化」を選択すればOKです。これで全身のボーンのできあがりです。
>うまくいかない箇所がある場合には、Ctrl(Command)+zで戻り、ボーンを修正します。

お疲れ様でした！ヒューマノイド用のオリジナルのボーンがこれで出来上がりました！
いま折り返し地点ぐらいです。

# [06] Blenderでボーンとメッシュを関連づける

ボーンのそれぞれに、追従させるメッシュパーツを割り付けていきます。
それぞれのボーンに対してメッシュの頂点がどれほど追従するかの割合を「ウェイト」と言います。
ロボット系モデルの場合には基本的にボーンとメッシュのパーツを1:1で対応させていきます。

### やること 06.0

ボーンとメッシュを関連づけます。
>オブジェクトモードにします。
>シフトを押しながら、メッシュ→ボーンの順に選択します。
>![ssg5 255.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/8610a53d-70f6-9a5e-a2dc-3d1fc193c83d.png)
>左上のオブジェクトメニューから「オブジェクト」→「ペアレント」→「アーマチュア変形」→「空のオブジェクトで」を選択します。
>これでボーンとメッシュが紐づきます。

### やること 06.1
ここで、ウェイトを編集するためのウェイトペイントモードを確認します。
>オブジェクトモードの状態で右上の「シーンコレクション」の逆三角形アイコンのところにある3Dモデルのメッシュを選択します。
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/1fb4f1c7-f096-f5d7-7134-f8bf66500189.png">
するとモード選択メニューから「ウェイトペイント」が選択できるようになります。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/29aa5ae7-723a-c0d9-6594-626b0fd0e6d2.png">
ウェイトペイントモードでは、メッシュの追従度が可視化されます。あるボーンに対して100%追従させるメッシュの頂点はレッド、追従させない頂点はブルー、50%追従させる頂点はグリーンとして、追従度がグラデーションでビジュアライズされます。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/154f81a6-6ae2-5c32-af0d-b4ae593fd895.png">

>右側のシーンコレクション内のメッシュの中に、図の様に頂点グループという項目ができているのを確認します。
><img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/f87ffcb5-9e4c-53a5-f4e4-f8b0aec16048.png">
この頂点グループがいつできたかというと、前の作業でボーンとメッシュを紐づけた際にできています。
つまり頂点グループは各ボーンに対応していおり、つけた名前もそのまま反映されています。

ウェイトペイントモードは文字通りペイントソフトのようなモードで、選んだ頂点グループに対し、各頂点のウェイトを直感的にペイントして割り当てていくことができます。フィギュアタイプのアバターを自然に動かしたい時には絶対必要な機能です。しかし、今回の対象はロボットでメッシュの追従度は基本的に0か1で指定していくので、このペイントによるウェイト塗りは使いません。

### やること 06.2
今回はロボット系のモデルなので、ボーンに追従させるメッシュをユニット単位で選択していきます。
>右のウィンドウで緑の逆三角形アイコンを選ぶと、図のように「ウェイト」を数値で設定できる画面になります。メッシュの割り当てを行いたい「頂点グループ」を選択し、「編集モード」で該当する箇所のメッシュを選択していきます。
メッシュの選択方法ですが、**選びたいメッシュに含まれる面や頂点をひとつ選択してからCtrl(Command)+Lキーで島選択**にしていきます。下準備の時にパーツ同士の分離を済ませてあるので、この作業はサクサク進むと思います。複数パーツを選択する時は、SHIFTを押しながら面や頂点を選択し、Ctrl(command)+Lキーで追加していけます。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/0b836dce-6975-1712-b2ce-bb03f4f0aad4.png">
「割り当て」ボタンを押すことで、そのボーンのウェイト割り当てが完了します。**割り当てボタンを押すのをお忘れなく。**
>
>また、ウェイトを削除する場合には、削除したい箇所のメッシュを選択して「削除」やウェイトを0にして「割り当て」します。
これを全パーツについて作業していきます。
>
>Tipsとして、膝当てパーツやリンク部品など、２つのボーンの中間的な動きをするパーツについては、それぞれのメッシュからの影響度を50%などにしておくとより自然な動きにできます。([みっちーさん](https://dream-drive.net/ "Qiita")に教えていただきました。)
>
><img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/85fdd6b4-f1e5-a9f4-ce87-5a60480132b6.png">
>編集モードでの選択の際、編集モード横のアイコンで「頂点選択」「辺選択」「面選択」を切り替えられます。この作業では「面選択」がクリックしやすく早いと思います。


### やること 06.3
この時点でのメッシュの追従を確認します。
塗り残しやウェイト設定ミスがあるとその部分は空中をフラフラしてしまいます。
>確認用にウェイトを可視化します。
>編集モードを「オブジェクトモード」に → モデルのメッシュを選択 → 編集モードを「ウェイトペイントモード」にします。
><img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/0b786993-9200-d6b3-ee8b-8ba75bc965d7.png">
>右ウィンドウのグリーンの逆三角形アイコンのオブジェクトプロパティ →「頂点グループ」の要素を選び、それぞれの頂点グループを順にクリック（もしくは上下カーソル）で選択していきます。
>メインウィンドウ上で該当箇所が赤く表示されるので、塗り残しがないかざっと確認します。
>
>次に、編集モード「オブジェクトモード」→モデルのボーンを選択→編集モード「ポーズモード」を選択します。
>ボーンを１つ選択し、Rキーを押すと、それぞれのボーンを回転できます。ボーンの親子関係や追従するメッシュが意図通りかどうかをここで確認できます。
>積み残しのメッシュを再設定しながら仕上げていきましょう。
>
>逐次、セーブを忘れずに。作業が無駄にならないようご注意ください。


# [07] ファイル形式.fbxで書き出す

できあがったモデルをUnity/VRChat用にエクスポートします。
### やること 07.1
>メニューの「ファイル」→「エクスポート」→「FBX(.fbx)」を選択し、.fbxファイルを出力します。
>出力設定は下図の通りでうまくいきました。
><img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/b6bb80eb-cccb-8f57-3dbd-07b2d7dce752.png">

**※Blender 3.0.1では「空間トランスフォームを使用」にチェックを入れると方向をうまく出力できました。(2022.02.23追記)**

お疲れ様でした。これでBlenderでの作業は終了です！
次はこれをUnityに持っていきます。ゴールまであと一息！

# [08] Unityにインポートする

ファイルをUnityにインポートし、ボーンの調整を行います。

### やること 08.1
.fbxをUnityにインポートします。
>Unityを開き、Assetsの画面で右クリック→「Imoprt New Assets...」で先程の.fbxをインポートします。
Assets内にインポートされたファイルをクリックすると、右側のInspectorの画面にボーン関係の設定画面が出てきます。
><img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/09a87411-86eb-4743-e624-996340e562c1.png">
ここで「Rig」の「Animation Type」を人型ロボットであればHumanoidに設定します。
Applyを選択すると、「Configure」ボタンが押せるようになるので押します。
><img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/7f13d040-b5af-ccaa-99bb-32bcdb782eb6.png">
blenderで設定したボーンがUnity側の人型ボーン自動アサインされます。
意図通りにボーンが対応していない場合には、手動で調整します。
Inspectorのボーンのスロットに、左のヒエラルキーウィンドウから該当するArmatureのパーツを選び、ドラッグ&ドロップで割り付けます。
![SS 389.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/da2b342a-390c-8214-ef95-f7ee09de7aed.png)
「Apply」を押して割り付けを完了させます。

### やること 08.2
Unity上で動作確認をしてみます。
>「Muscles&Settings」を選択します。
スライダーでボーンを操作することができるので、ボーンが正しく設定されているか、メッシュが正しく追従するかをここで確認できます。
意図通りに動かない場合は[06]に戻り、不具合箇所を修正しましょう。
><img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/7a1e339a-6ff7-cdcb-d844-7fd3c857c8c9.png">
>
うまくいったら一旦セーブしておきます。

ここでunity-chan!等のアセットをインポートして設定すると、ロボットをUnity上で自在に動かすことができるようになります。が、その方法はここでは割愛します。（検索すればやり方がいろいろ出てきます。）
![xemnesgifmovie1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/f10ce5f0-57dc-c4d2-aa5c-450adb9164a4.gif)



# [09] UnityにVRChatSDKを導入する

### やること 09.1
公式サイトからVRChatSDKをダウンロードしてインストールします。
>https://hello.vrchat.com/ の一番下に「GET SDK」のボタンがあるので、クリック。（必要に応じてサインアップし）ログインすると、メニューの「Download」からSDKが入手できるようになります。
今回は凝ったことはしないので「VRCHAT SDK2」を使います。
（SDK3についてはまた別の機会に）

><img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/52b9329d-ee03-5105-2797-6eb0f4d6712c.png">
>SDKのインストール方法ですが、Unityを開いた状態でDLしたSDKのパッケージをダブルクリックすると、自動的にSDKがUnityに入ります。（と思います。）
><img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/7755ed80-867f-3b0b-0691-55b2a4986779.png">
>インストールに成功していると最上部のメニューバーに「VRChat SDK」が追加されます。
>「VRChat SDK」から「Show Control Panel」→「Authenticigation」を選択し、VRChatのIDとパスワードを入力しておきましょう。
>ここでAvator Creator Status: がAllowed to publish avatorsになっていない場合には、VRChat上の信頼度がデフォルトのVisitorということだと思います。VRChat上で活動を行なってしばらくするとNew Userにランクが上がりアバターをアップロードできるようになります。時間のない方は課金（1000円程度/月）をすればブーストされすぐにランクが上げられると思います。


# [10] Unity上でモデルをVRChat用にととのえる

最後の仕上げです。VRChatで使えるように、マテリアル（表面素材の設定）を張り替えたりスクリプトを追加したりします。


### やること 10.1
必要に応じてマテリアルを張り替えます。VRChatでアバターをOculusQuest版に対応させるにはいくつかの条件があり、たとえば表面や質感を設定する**マテリアルは最大4つまで**が推奨値となります。また色味を決めるシェーダーもOculusQuestに対応した専用のシェーダーである必要があります。

>Assetsの中のモデルの横にある矢印をクリックします。
><img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/de70df0c-38cf-db8c-bfa0-be63102bcd03.png">
>すると図のように中身が表示されます。色のついた玉が、3Dモデルに使用しているマテリアルになります。
>
>モデル自体をクリックしインスペクターの「Materials」を選択すると、そのマテリアルに使う要素の一覧が出てきます。
><img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/0c8e5a8c-f229-747f-191c-7ccd0ff40e02.png">
>図の例では各マテリアルがNone(Material)となっており、マテリアルが割り当てられていない状態になっています。マテリアルを改めて割り当てていきます。
>
>Assetsの中で右クリック→Create→Materialを選びます。すると球体アイコンの新規マテリアルが追加されますので、これをクリックします。
>一番上のShaderのところからShader→VRChat→Mobile→Standard Lite（他のものでも良い）を選択します。
>次に「Color」のところで色を選択します。これでVRChat対応のマテリアルができました。
>
>改めてAssetsの中の3Dモデルをクリックしインスペクターの「Materials」を選択します。
None(Material)となっているところに、AssetsのMaterialをドラッグ＆ドロップでアサインします。
>Assets内のマテリアルをCtrl(Command)+Dで複製し、必要な数の色のマテリアルを作成し、モデルにアサインしていきます。
>最後に「Apply」を押してマテリアルの割り当てを完了させます。
>
>図の例ではマテリアルを5つも使ってしまっており推奨値オーバーとなります。データを削減するためにマテリアルを1つにし、UVペイントで素材を貼り付けるのは非常に効果的ですが、解説が煩雑になるのでその手順は今回は省略します。

### やること 10.2
3Dモデルをシーンに配置し、数値を整えます。
>今まで作業していた3DモデルはまだAssetsの中にある状態です。
調整した.fbxファイルを選択し左上のHierarchyウィンドウにドラッグ＆ドロップすることで出力ができるようになります。
Hierarchyウィンドウ上でモデルを選択すると、右側のInspector画面に内容が表示されます。
Position,Rotationは基本的にすべて0でOKです。
またSchaleは1でよいですが、サイズを変更したい時にはここで倍率を変更してみてください。基本的にxyzすべて同じ数値を入力します。

### やること 10.3
VRChat用のスクリプトを追加します。
>Hierarchyウィンドウ上でモデルを選択し、右側のInspector画面を確認します。
>一番下に「Add Compornent」というボタンがあるので押します。
><img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/6dbd4dee-3a76-cd83-4177-e2cd525cbd7a.png">
>テキストボックスに「vrc」と入力し、「VRC Avator Descriptor」を見つけ選択すると、スクリプトがアタッチされます。

これでVRChatへのアップロードのための準備がすべて整いました！たぶん整いました！

# [11] モデルをVRChatにアップロードする

いよいよアップロードです。

### やること 11.1
とりあえずモデルを1つアップロードしてみます。
>画面最上部にあるメニューの「VRChat SDK」から「Show Control Panel」を選択します。
><img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/e7cf28c8-4a6c-b985-26bb-e5266d9e1844.png">
>条件を満たしていないといろいろとコーションがつきます。赤い！マークのものは解消しないと先に進めません。
>ここで引っかかりそうなクリティカルなものは一通り説明済みですので、コーションが出た場合には手順をもどったりして確認してみてください。
>黄色の!のところの注意に関しては、一旦無視して進んでもかまいません。アップロードが成功してから、作り込んでいきましょう。
>クリティカルなコーションを消すことができれば「Build&Publish for Windows(もしくはAndroid)」を押せるようになります。

VRChatではPC用のアバターとOculusQuest用のアバターの2種類がありますが、実はそれぞれ独自のものです。条件が厳しく軽量データなOculusQuest用のアバターをアップロードすればPCでも対応してくれそうですが、実際にはPCからは見えず使えずで、別途PC専用のアバターデータをアップロードする必要があります。

### やること 11.2
Blueprint IDを確認し、モデルをPC/Quest両対応にします。
>実は、アップロードしたアバターにはBlueprint IDという固有のIDが自動で割り当てられています。
>
>アップロード後にUnity上のHierarchyウィンドウの3Dモデルを選択すると、InspectorのPipeline Manager(script)にBlueprint IDが表示されていると思います。
デフォルト状態からアップロードした場合には、まずPC用のアバターとしてアップロードが実行されたと思います。
VRChatSDKのControlPanelのBuilder画面にある横長のボタン「Switch Build Target to Android(もしくはWindows)」を押すと、ビルドのモードが切り替えられます。
準備が整ったら「Build&Publish for Android(もしくはWindows)」を押してアップロードを実行しましょう。
Blueprint IDがそのままなので、同じIDで２つ目のファイルがアップロードされます。今回のアバターはPC/Quest兼用になっているはずです。
色違いやサイズ違いなど、別のアバターを登録する際には、Pipeline Manager(script)にBlueprint IDのところをDetouchしておきましょう。IDを空にしておくことで、アップロードするアバターに自動的に新たなIDが割り振られます。

# [12] 動作確認する

アバターが使えるようになっているか確認しましょう。

### やること 12.1
>
>PCやOculusQuestでVRChatにログインし、アバターが追加されているか確認します。
>その際、アバターの右上にあるアイコンがグリーン、ブルーの両方とも点灯していれば、PC/OculusQuest両対応のアバター作成に成功しています。

うまくいっていればオリジナルの3Dモデルが、デフォルトのモーションアニメーションで踊ったりバク転したりできるようになっています。


# おわりに
ネット上にはすでに情報がたくさんありましたが、アップロードまでの工程が多く情報が点在しており、またロボットというやや特殊なモデルであるため、「とりあえずこれだけみながらやればアップロードまでいける！」という記事になかなか辿り着けず苦労しました。
わからないところをTwitterやVRChat内でアドバイスいただけましたので、世の中に還元する意味も込めて、思いつく限り現状最小限の手数でアップロードまでたどり着ける記事を目指してみました。
ロボット系の3Dモデルを作られている方は大勢いると思いますが、VRChatは自作の3Dモデルを動かしたり見せたりするのにはなかなか面白いツールだと思います。この記事がみなさんの創作ライフに少しでもお役立ちできればと思います。

# つづきの記事
https://qiita.com/Ninagawa_Izumi/items/98cea4ab34970d3667d6

→ 主に軽量化の目的でUVテクスチャを貼る場合の手順です。


https://qiita.com/Ninagawa_Izumi/items/3943f4bcc20de9800c55

→ VRChatにアップロードする際の留意点です。

### 変なところがありましたらコメント欄等でご指摘ください！

# 参考にさせていただいたサイトや動画
* VRChat メカCADからアバター作成メモ　Autodesk Fusion 360(ソリッドモデリング)→Blender2.8→Unity2018
https://ch.nicovideo.jp/S-Thurk/blomaga/ar1896233

* 【VRChat】Blenderで作ったモデルをUnityからVRChatにアバターをアップロードする方法
https://qiita.com/nonkapibara/items/0a366ff86e97d690feac

* 【完全版】BlenderやFBXのモデルをVRChatで使おう！
https://qiita.com/100/items/39200bffaa0cca904bb4

* [VRChat] PCアバターをQuest対応化するための最低限の設定
https://qiita.com/hirakichi/items/dcecd282808003a6ba01

* Blenderでテクスチャを作成してUnityに取り込むまでのメモ
https://qiita.com/Q1J011/items/6c945bd723d9e9d48427

* 【Blenderチュートリアル】UV展開とテクスチャペイントを学ぼう【初心者向け】
https://www.youtube.com/watch?v=Ck5GbpF4geA

* 【♂∩♀04】オリジナルアバターでVRChatに行く講座〜バーチャルへの旅のすゝめ〜
https://www.youtube.com/watch?v=_1K-bS0neH0&feature=youtu.be

* 【VRChat】VRChatの遊び方！最初は何すれば良いの？（設定編）
https://www.syaopurin.com/vr/vrchatnoasobikata1

* VRChat アバター最適化メモ
https://dskjal.com/unity/vrchat-avatar-optimization.html

* VRChatのパフォーマンスランクについてまとめる（VRChat 2018.4.4）
https://bluebirdofoz.hatenablog.com/entry/2019/01/21/091452