見出し画像

アバターのfbxファイルをVRChatにアップロードするまで

Blenderで作成/編集したアバターデータをUnityで設定してVRChatにアップロードするまでの流れを解説します。アバター改変をする場合について書いていますが、新規アバターについても全体の流れは同じなので参考にできるかと思います。

この記事を読んで作業したけどうまくいかない!とお困りの方はどうぞ気軽にまでご連絡ください。できる限りサポートします。

Blenderでの準備

まず、Blenderからエクスポートする前にスケールなどの確認をしておきます。

出力したいオブジェクト(メッシュ、Armature)のプロパティを確認して、スケールやロケーションに余計な値が入っていないか確認します。
Location 0, Scale 1.000となっていることを確認してください。ここに値が入っていると Unityで色々なトラブルの原因になります。その場合はCtrl+AでApply Transformして直しておきましょう。特にスケールの値が入っていると、シェーダーのアウトラインが極細/極太になったり色々な問題が起こる可能性がありますので要注意です。なお、後で補足しますが Rotation X: 90だけは問題ありません。

オブジェクトの原点も確認します。原点とは、メッシュなどのオブジェクトを選択したときに表示されるオレンジの点のことです。回転などの操作の基準になります。

オブジェクトの原点

原点が座標系の中心に来ていることを確認します。
原点位置がおかしい場合は、Shift+Cで3Dカーソルを座標系の原点に戻してから、Object > Set Origin > Origin to 3D cursorで変更しておきます。

原点を3Dカーソルへ

なお、アバターとその服はこれでよいですが、スキニングしていない小物などはワールド原点でない方が都合が良い(ことが多い)ので場合に応じて対応してください。
参考:

補足: Rotationの修正

この工程を飛ばしてもおそらく大きく困ることはないのですが、Unity上で意図しないことが起こります。それがこのRotation X: -89.98です。

Rotation X: -89.98

UnityとBlenderでは座標系が違う関係で、X軸の回転に値が入ってしまいます。この値は実際には-90°のことなのですが、Unity内部の計算と有効数字の関係から、89.98という数値となるようです。この状態でもアップロードまで問題なくいけますが、なんだか気持ち悪いですし余計なトラブルになっても嫌なので直していきます。
直し方は簡単で、Xが-90°となるのであれば、最初からX軸方向に90°回転させておけばよいのです。
まず、メッシュオブジェクト→Armatureの順で選び、Alt+P からClear Parent: Clear and Keep Transformします。

Clear Parent

ペアレントを解消したらオブジェクトを全て選び、オブジェクトモードでR→X→-90とします。オレンジアイコンの方のArmatureも忘れずに選択しましょう。これで-90°回転しました。

X方向-90°回転

そのまま選択状態でCtrl+Aから一旦RotationをApplyします。

Apply Rotaion

これで-90°回転したモデルができました。最後に、再度オブジェクトを選択してから、R→X→90とします。これでX方向に90°回転したモデルの完成です。
忘れずに再度Ctrl+PでArmatureとペアレント設定しておきます。一応、各メッシュの Armature Modifierの設定が合っているかも確認しておきましょう。完成形は以下のようになります。

Rotation X: 90 となった

Rotation X のみ 90で、その他は0になっていればOKです。
ちなみに余談ですが、Unity2019だとこの設定が必要なのですが、新しいUnityバージョンではインポート時に自動で変換出来るようになっているようです。

問題なければ、エクスポートに進みます。

Blenderの出力設定

まず、fbxファイルの出力設定から。BlenderでFile > Export > FBX (.fbx) と選択します。

Export > FBX

ウィンドウが開いたら、出力先に含むアイテムを選択します。
Include > Object Types から Armature, Mesh のみを選びます。
次に、座標系を設定します。
Transform > Apply Settings を All local から FBX All に変更します。ここでスケーリングがLocalのままだと、Unity上でスケール100とかになります。そのまま無理やり設定しようとすると、アウトラインの太さやPhysBoneの Radiusなどあらゆる設定値が2桁ずつズレます。よくあるミスなので気をつけましょう(たまに販売データでもそういうのあります……)。

Apply Settings: FBX All

下にスクロールすると、Armature の中に Add Leaf Bones という設定があります。これは場合によってチェックを入れるかが異なりますが、多くの場合オフで問題ないと思います。

Add Leaf Bones

注意すべきはオリジナルのアバター、あるいは.blendファイルを直接開いている場合です。
Unity上でArmatureの中に「〇〇_End」というボーンが含まれていれば、リーフボーンが付いています。もし Unity上でリーフボーンがある場所に Blender上でリーフボーンがない場合は、リーフボーンを追加してください。新規に作るアバターならばこの後の補足を読んで必要に応じて選択してください。

補足:リーフボーンについて

リーフボーンとは何かというと、末端ボーンの先端に追加されるボーンのことです(〇〇_End のような名前になります)。UnityではボーンはGameObjectとして表されるため、末端のボーンは長さの情報を持ちません。(より正確には、ボーンの"長さ"という概念自体がなく、長さが必要な場合はそのボーンの子ボーンの位置がボーンの先端として扱われます。)そのため、Physboneを設定する場合にはEndpoint positionを設定するか子ボーンを追加して末端ボーンに長さを持たせる必要があります。この子ボーンを末端ボーン先端に自動生成するのがリーフボーンです。
また、子ボーンを持たない1本だけのボーンにPhysBoneを適用したい場合、Endpoint Positionを設定しても意図しない方向にPhysBoneが伸びてしまう場合があります。そのような場合はリーフボーンを追加すると良いでしょう。勿論、リーフボーンを追加せず手動でボーン先端に子ボーンを生やしても同じことです。

以上の設定が終わったら、Export FBX を押してfbxファイルを出力します。
なお、このときの設定をプリセットとして保存しておくと便利です。

プリセットを追加

補足:出力先について

Unity project内(Assetsフォルダ)に直接出力すると便利です。Prefab Variantを活用すれば、fbxの上書き修正も可能です。
詳しくはこちらの記事を参考にしてください。

Unityへのインポート

fbxファイルを無事出力できたら、Unityにインポートしていきます。
project内にエクスプローラーからドラッグ&ドロップでfbxファイルをインポートします。インポートされたfbx(ダンボール箱のアイコン)を選択すると、インスペクタにfbxファイルのインポート設定が表示されるので、以下のように設定してください。

Model タブ

Import Cameras, Import Lights をオフ(Blender出力時にCamera, Lightのチェックを外していればここのチェックはつけたままでも問題はありません)
Read/Write Enabled
これをチェック入れ忘れると、アップロード時にポリゴン数がとてつもない数になるエラーが起こります。
Blender Shape Normalsを None にする。これをしないとアバターが非常に重くなります。ただしシェイプキーの使い方によっては必要な場合もあるかもしれません。詳しくは以下の記事を参考にしてください。

以上の設定をしたら、Applyします。

Model Tab

Rig タブ

Animation Type を Humanoid に変更。
Apply → Configure… の順にクリック。

この時、開いているSceneが未保存だと、Sceneを保存するかを聞かれます。ポップアップが出た場合は Save を押してシーンを保存します。

シーンが変更されています。

この画面で各ボーンがHumanoid Rigとマッチしているかを確認していきます。大抵の場合は自動的にうまいこと設定されているはずです。
が、Head内のJaw(あご)だけは前髪のボーンなどが間違って割り当てされていることが多いので、確認しておきます。間違ったボーンが割り当てられているときは削除して、JawをNoneにしておきます。あごのボーンはリップシンクをボーンでやる場合に使われるものなので、基本的には使いません。(通常、リップシンクはシェイプキーで行います。)

JawをNoneにする

すべてのボーンが問題ないことを確認したら、画面下にスクロールして
Apply→Doneの順にクリックします。

Apply→Done

なお、ここでエラーが起こると、以下のように見つからないボーンに対応する部分が赤く表示されます。ちなみに下の画像はArmatureを含まないfbxファイルなので、すべて真っ赤になっています。

ボーンが見つからない場合

Animationタブ

設定不要です.

Animation Tab

Materials タブ

こちらも設定は不要です。
ただし、Materialが必要な場合のみ、Extract Materials… を押してマテリアルを抽出します。既存アバターに非対応服を着せる場合は、服のデータ(unitypackage)にMaterialが含まれているはずなので、Extractする必要はありません。

Mateials Tab

プリセット

なお、一通り設定したら、右上のアイコンからインポート設定を保存できます。Select Presetというウィンドウが表示されるので、 Save Current to… を押します。

Save Preset

保存先を聞くウィンドウが表示されます。FBXImporterという名前になっていると思うので、そのまま保存します。

FBXImporter.preset

これでAssetフォルダ直下にFBXImporter.presetという設定ファイルが保存されました。
次回からは、右上のアイコンからSelect Presetを開き、保存したプリセットをクリックして適用すればokです。

Select Preset

これでfbxをインポートするたびに毎回いちいち1つずつチェックを入れる虚無作業から解放されます。
プリセットについて詳しくはこちらのUnity Manualを読んでみてください。
https://docs.unity3d.com/ja/current/Manual/Presets.html

メッシュの設定

インポート設定完了したら、fbxファイルを Hierarchyにドラッグ&ドロップします。ここからメッシュ(Skinned Mesh Renderer)の設定をしていきます。

マテリアル設定

改変の場合は、元々のアバターデータ、衣装データに付属してきた Materialがあるはずなので、それを各メッシュに適応していきます。名前から判断しづらい場合もあるので、改変前のアバターや衣装データも Hierarchy上に置いて見比べながら同じマテリアルを設定していくと良いです。

マテリアル設定

※Quest対応アバターをアップロードする場合
この時、Quest用に設定する場合は、使えるシェーダーが限られるため、マテリアルに適用するシェーダーを変更する必要があります。PC用に多く使われているliltoonやUTS2, poiyomi shaderなどは使えません。Quest対応する場合、基本的にはVRChat/Mobile/ToonLit を使うと良いです。ただし、このシェーダーは透過が使えないため、頬染めなどの表現が崩れる場合があります。その場合は頬染め表現のアニメーションを変更するなどの対応が必要になります。詳細については調べてみてください(丸投げ)。

参考
分かる人向けになりますが、Quest用アバターでもToonLitではなくStandardシェーダーを使うことでMatCapやNormalMapを使ったリッチな表現をすることも可能です。詳細は以下のリンクを参考にしてみてください。

Boundsの設定

Boundsとは、メッシュを描画するかを判定するための領域のことです。下の画像で表示されている白い枠がBoundsです。

Bounds

Blenderからfbxファイルを持ち込むと、各メッシュのBoundsはメッシュのサイズによって自動的に決定されます。しかし、それでは下着やアクセサリー、靴のようなサイズの小さいオブジェクトはBoundsが小さくなってしまい、視界の端にいるとメッシュが表示されずに消える、なんてことが起こります。そのため、すべてのメッシュのBoundsを同じサイズ、位置に統一することが推奨されます。
Skinned Meshであれば、同じRoot Boneかつスケールが同じなら、単純に複数選択して同じ値を入れるだけでokです。

BoundsとAnchor Overrideの設定

Anchor Overrideの設定

VRChatで暗いワールドに行くと、顔だけ暗くなったり、メッシュ同士の明るさが均一にならないことがあります。この原因の一つとして、Anchor Overrideの設定があげられます(そもそもマテリアル、シェーダーの設定が違うのが原因のこともあります)。
メッシュに光が当たるとき、通常はBoundsの中心で当たっている光が計算されますが、これだと体や服など各パーツごとに異なる明るさで描画されてしまいます。そこでAnchor Overrideを設定すると、明るさ計算に使う座標を指定できます。どこを指定するかの絶対的な正解はありませんが、Chestボーンあたりを指定しておくのが良いようです。すべてのメッシュで同じオブジェクトを指定してください。

VRChat用の設定

ここからはVRChat用の設定です。元のセットアップ済みのアバターデータから、設定を移していきます。必要なのはVRChat Avatar Descriptor、PhysBone, Cloth(使用している場合)あたりです。それ以外にもUnityでセットアップしているコンポーネントがある場合は、それも移します。
やり方としては、Unity標準機能でコピーする方法をまず紹介します。その後一括コピーできる便利な拡張ツールを紹介します。

VRC Avatar Discriptor

まずは Avatar Descriptor。VRChat用アバターとしてアップロードするために必須のコンポーネントです。元のアバターのオブジェクトを選択し、Inspectorから VRC Avatar Descriptorの名前部分を右クリックし、Copy Componentします。コピーできたら、改変後のアバターデータのInspectorでTransformやAnimatorのタイトル部分を右クリックし、 Paste Component As Newします。

Copy Component
Paste Component As New

これでAvatar Descriptorがまるっとペーストされました。ただし、Avatar Descriptor内部のメッシュやボーンの参照は古いアバター側のままなので、新しいアバター側のメッシュ、ボーンに指定し直す必要があります。
具体的には下の画像の赤い部分です。

VRC Avatar Descriptor

アバター改変で同じ アバターとしてアップロードする場合は、Pipeline ManagerにBlueprint IDを Attachするのも忘れずに行いましょう。Pipeline ManagerはAvatar Descriptorをアタッチすると自動的に付くComponentです。
Blueprint IDはアバターを区別するためのIDです。アップロード済みアバターを上書きしたい場合は、同じ Blueprint IDを設定する必要があります。VRChat SDKのウィンドウから、Content Managerを選ぶとアップロード済みアバターの一覧が表示されるため、Copy IDを押すと Blueprint IDをコピーすることができます。

Phys Bone

 揺れものがある場合はPhysBoneの設定も必要です。元のアバターの Armatureを開いて、どこのボーンに VRC Phys Bone Componentが付いているかを確認し、同じボーンに設定していきます。

PhysBoneを探す

ここではEarやHair、TailにPhysBoneが付いていました。例の如く設定値は Copy Componentして Paste Component As Newします。Root Transformなどにボーンが指定されている場合は、そこだけ新しいアバターのボーンに手動で設定し直します。なお、VRC Phys Bone Componentが付いているオブジェクトとRoot Transformが同じ場合は、Root Transformを設定せず空欄でも問題ありません。

Root Transform, Collidersの参照

Phys Bone Collider についても同様です。
ここで、コライダーがボーンではないGameObjectに付いている場合は、そのGameObjectごと新しいアバター側にコピーしてくる必要があります。その場合、コピー元のアバターPrefabをunpack Prefabし(コピー先はunpackする必要はありません!)、コライダーのついたオブジェクトを同じ階層に移していきます。Phys Bone Component 内のCollidersで参照されているオブジェクトをクリックすれば、Hierarchy内のコライダーを見つけることができます。

コライダー用オブジェクト

ここまでを全て手動でやるとまあまあ面倒ですね。

便利なツール

ここまで手動でやる方法を紹介しましたが、どう考えても面倒なので、CopyComponentByRegexという便利な Unityエディタ拡張を紹介します。
これはコピー元の階層からコピー先へ、正規表現で名前がマッチするコンポーネントを自動コピーしてくれるツールです。しかも、各コンポーネント内の参照も自動で新しい階層から探して修正してくれます。先ほどの Avatar Descriptorの顔メッシュ指定や、PhysBoneのコライダー指定なども、手動でやり直す必要が無いということです!素晴らしい。

インストール方法はリンク先を参照してください。
インストールできたら、Hierarchy内のGameObjectを右クリックすると、CopyComponentsByRegexという項目が追加されているはずです。

CopyComponentsByRegex

Phys BoneやAvatar Descriptorなどのコンポーネントは、すべて名前が"VRC "で始まっているので、"VRC"と入力してコピー&ペーストすることで、VRChat関連のコンポーネントを一気に移すことができます!
このとき、先ほど言及したコライダーのためのGameObjectがある場合は、それを先に手動で移してからCopyComponentsByRegexを使用します。でないと、ペースト先に参照すべきコライダーが見つからなくなってしまいます。

アップロード

以上の設定が完了したら、あとはいつも通りVRChat SDKからアップロードして完了です。
テクスチャを触った場合、MipMapについてのエラーが出ることがあります。その場合はAuto Fixを押してください。
以上、お疲れ様でした。

Mip Maps Error


VRChat関連の技術的な情報などを書いています。「スキ❤️」や「フォロー」していただくとモチベになります。「サポート」していただいたら私が美味しいものを食べます。