VRChatアバター 改変の流儀(by lil)
半分ぐらいアバター自作みたいな解説になっています。これが答えというわけではなく、あくまで私の方法なので適宜手順をすっ飛ばしたりしてください。
有料ツール
他ツールを使う場合は適宜読み替えてください。
- Better FBX Importer & Exporter - $28
- CLIP STUDIO PAINT PRO(以下、クリスタ) - 買い切りは5,900円
Blender湯通し
まずBlenderを開きます。そしてアバターのfbxをインポートします。現代のアバターは大体7万ポリゴンを超過しているためです。現在はあまり見かけませんが、スケールが100倍になっていたり-89.98度回転していたりする問題も修正します。
ポリゴン削減
手作業で辺や頂点を溶解していきます。
- 適当な辺をクリック
- ループ選択(辺ループ)
- 辺を溶解
基本的にこれの繰り返しです。関節など変形の大きい箇所や角度の急な面よりもなだらかで変形の少ない箇所を優先的に削っていきます。着せ替えもすると思うので、素体や髪は他メッシュにポリゴン数が割ける用に余裕を持って削減したいところです。
メッシュの編集
編集前に必ず編集対象のシェイプキーがBasisであることを確認しましょう。(n敗)
Unity上でできない編集をここでやります。具体的には髪の毛に新しい毛束を追加したり目のハイライトをいじったり……。1から作っても良いですが、新たにUV展開したり既存のテクスチャに合わせて展開したりするのは面倒なので、既存のメッシュを複製して変形するとある程度の時間短縮になります。あと、編集後は必ずウェイトやBlendShapeも確認しましょう。これを怠るとバーチャルウニになることができます。
BlendShapeの追加
Shrink系がない場合はこれを追加すると着せ替えで貫通防止やAAO Remove Mesh By BlendShapeによるポリゴン削減ができて便利になります。また、表情作成時に足りないBlendShapeがある場合はここで自作のものを追加します。
ウェイトのないボーンの削除
これはPhysBoneのTransform数に影響するので大事です。endボーンのような不要なボーンは削除しておきます。
お好みで衣装と素体の分離
他衣装に着せ替えを行うので最初からアバターデフォルト衣装と素体を分離し、扱いやすくする手もあります。分離した衣装はModular Avatarで着せます。
書き出し
fbxを書き出します。Better FBX Importer & Exporterで書き出すと不要な回転が入りません。基本的には初期設定のまま書き出して大丈夫で、お好みでIgnore Armature Node
のチェックを外します(Hipsの上にArmatureオブジェクトを残すかどうか)。
新規Unityプロジェクトの作成
プロジェクトの運用方針によって異なりますが、私は素体(ベースとなるアバター)ごとにプロジェクトを分けているのでここでALCOMで新規プロジェクトを作成します。カスタムテンプレートを作っているとツールの導入などを省略できます。私はそれをサボっているので毎回ツールを突っ込んでいます。ちなみにUnityなどが意味不明なエラーを出して死ぬことがあるので、プロジェクトのパスにマルチバイト文字(日本語など)が入らないようにしましょう。
ツールの導入
- lilToon
- lilAvatarUtils
- lilycalInventory
- lilEditorToolbox
- Modular Avatar
- Non-Destructive Modular Framework
- AAO: Avatar Optimizer
- anatawa12's gists pack
を導入します。上記ツールは全部ALCOM(VPM)で入れることができます。ここまでやって初めてプロジェクトを開きます。初回はツールのコンパイルなどが入るのでちょい遅いです。
Unity上での初期設定
アバターや衣装などのunitypackageをインポート
unitypackage内のファイルは基本使わないのですが、マスクテクスチャなどがunitypackage内にしかなかったりするのでなんだかんだでインポートしています。
FBXをインポート
Sort Hierarchy By Nameのチェックを外し、RigをHumanoidに。RigはlilEditorToolboxでモデルインポート系の機能を有効にしている場合は自動でいい感じにしてくれます。加えて新規マテリアルを作ってMaterialsタブで割り当てます。不要なImport~系はオンのままでも影響はないと思いますが、販売アセットを作る場合などで気になる場合はオフにしても良いと思います。
新規シーンを作成&保存
何らかの要因でデータを吹き飛ばされる可能性があるため、SampleSceneで作業しないようにしましょう。新規シーンはScenesフォルダを作ってその中に保存することが多いです。
シーンに配置&ざっくり設定
FBXをシーンに配置し、それを見ながらマテリアルを編集します。表情だけ半透明で、それ以外は不透明で良いと思います。ちなみにPrefabは絶対Unpackしないようにしています。Unpackはメッシュデータ以外を複製して編集可能にするような機能なので1度実行すると戻せず、さらにFBX更新時にメッシュデータとUnpack後のデータに齟齬が発生してアバターが破壊される可能性が跳ね上がります。
テクスチャ改変
アバターは自分カラーに改変する人が多いんじゃないでしょうか。私もです。クリスタを開き、psd(もしくはclip)を開きます。レイヤー分けされたデータが付属していない場合は非常につらいですが、根性で編集します。
大まかな色の変更
楽をする場合は各パーツの一番上にグラデーションマップレイヤーを追加して自分色にして終わりです。
丁寧に改変する場合はレイヤーごとに編集します。大体〇〇ベース
みたいな名前のレイヤーがあるのでそこの色を変更します。影やハイライトもベース色に合わせて変更します。ベースと影とハイライトは色相はずらしたほうがいい感じになりやすいです。例えば黄色やベージュの場合は赤っぽい影、白い場合は青紫っぽい影みたいな感じです。
加筆
ほっぺたとか影とか髪のメッシュとかを加筆します。場合によっては一から描く場合もあります。
書き出しと微調整
psdで直接Unityプロジェクトに保存します。制作ツールに慣れている人ほど「psdのままUnityで使ったら見た目が変わるのでは?」と考えるかもしれませんが、psdファイルの中には各レイヤーの情報の他にプレビュー用の画像が保存されており、Unityはこれをテクスチャとして取得するらしいので書き出し元のツールが壊れていない限りは見た目が変わらないはずです。
保存したテクスチャをマテリアルに割り当て見た目を確認します。他部位の色によって印象が変わるのでざっくりでも良いので全テクスチャを改変してから確認しましょう。
微調整したい場合はクリスタに戻り、再編集&psdの上書き保存をします。保存後にUnityに戻ると即座に編集が反映されます。これがpsdを直接Unityに入れる利点です。
マテリアルの調整
大体lilToonのプリセット欄からイラスト系プリセットを割り当ててそこから調整します。アバターの作風や色によって影の色やリムライトなどを調整します。全マテリアルで共通の設定を行う部分はlilycalInventoryのLI MaterialModifierに任せるのでここでは編集しません。
距離クリッピングキャンセラーを有効化
メッシュに近づいても貫通しなくなる機能です。シェーダーコード自体に変更が加えられるのでlilToonを使った全マテリアルに適用されます。
暗い場所で目を光らせる
瞳やハイライトの部分を白く塗ったエミッション用のマスクテクスチャを作成して発光に割り当て、メインカラーの強度を1にします。蛍光の数値を上げると明るい場所で目が過剰に明るくなるのを抑制できます。
LI MaterialModifierを使った改変
とりあえずlilycalInventory付属のprefabを突っ込みます。
[General] Optimize.prefab
- マテリアルの最適化[lilToon] Distance Fade.prefab
- 距離フェードの適用(顔を近づけると暗くなるやつ)[lilToon] Fix Lighitng
- ライトの設定の統一
あと適宜自作のprefabも突っ込みます。輪郭線のVR時に非表示
のようなパラメーターはアバター全体で統一したいので、こういうパラメーターはLI MaterialModifierで自作prefabを作って複数プロジェクトで共有します。
VRC Avatar Descriptorの追加
アバターにVRC Avatar Descriptor
コンポーネントを追加します。
View
は両目の瞳の中間になるように設定します。多くの場合は顔のポリゴンにめり込む状態になると思います。
LipSync
はViseme Blend Shape
に設定します。基本的には自動でBlendShapeが割り当てられます。
Eye Look
は動かしすぎない程度にいい感じに。
Playable Layers
は複雑なギミックを実装しない限りは放置です。
Lower Body
はUse Auto-Footsteps for 3 and 4 point tracking
をオン、Force Locomotion animations for 6 point tracking
をオフにすることが多いです。
Expressions
も自作ギミックを入れない限りは放置で。
Colliders
は大体いい感じになっていますが、Headは小さめになりがちなので頭サイズに合わせておきます。
PhysBoneの設定
PhysBoneはボーンに直接付けず、アバターのルート直下に新規GameObject(名前PhysBone)を作成し、その中にPhysBoneコンポーネントごとにGameObjectを作って追加していきます。
Transforms
Root Transformは房ごとに設定するのではなく、各房の親に設定してコンポーネント数を削減します。Multi Child TypeをIgnoreにすればボーンが枝分かれした根本のボーンが揺れなくなるので、各房の根本のボーンの位置が変わって変になるという問題も発生しません。
また、endボーンを削除したのでEndpoint Pisitionを調整します。大抵はYの数値を0.05とかにするといい感じになります。どう調整してもおかしくなる場合はボーンの向きが不正なのでBlenderで修正してください。
Forces
とりあえず以下のような設定にしてから微調整します。以下設定はフワッフワに揺れるので揺れもの感がいい感じに出ます。
名前 | 設定 |
---|---|
Integration Type | Simplified |
Pull | 0.1 |
Spring | 0.9 |
Gravity | 0.5 |
Gravity Falloff | 1 |
Immobile Type | World |
Immobile | 0.5 |
Limits
特定の範囲内で自由に揺れてほしい場合はAngle、一定方向にだけ揺れてほしい場合はHingeに設定します。コライダーで無理やり範囲制限をするよりも安定し、パフォーマンスランクでも有利になるので腕の見せどころです。
Collisions
Radiusはメッシュの見た目に合うように調整します。カーブを使うと多少メッシュの太さに変動があっても合わせられます。Allow Collisionは手のすぐ近くにある揺れもの以外はTrueに設定し触って揺れるようにします。
Stretch & Squish
伸び縮みさせたい場面がそんなにないのでデフォで運用することが多いです。お好みで調整。
Grab & Pose
Trueのほうが面白いことになるのでTrueに設定することが多いです。
最終確認
一通り設定したらパフォーマンスランクを確認します。コンポーネント数が多い場合はAAO Merge PhysBoneで統合します。Transform数が多い場合はウェイト0のボーンが残っていないかを確認、なければAAO Merge Boneでボーンを間引きます。コライダー周りが超過している場合は角度制限に置き換えます。
表情作成
なんかいい感じのツール作りたいです。
表情以外のアニメーション
複雑なものでない限りはlilycalInventoryのコンポーネントで完結させています。オブジェクトのオンオフやマテリアルの差し替え、BlendShapeの操作などはLI ItemTogglerやLI SmoothChangerで対応できます。AnimatorControllerもAnimationClipも不要な時代。
その他コンポーネントの追加
AAO Trace And Optimize
とかLI AutoFixMeshSettings
のようなとりあえず付けておけば良い系のコンポーネントを付けておきます。
汎用ギミックの導入
衣装にかかわらず常に使うようなギミックはここで導入しておきます。カメラ拡張とかライト調整とかです。
アバターのPrefab化
一通り改変したらアバターをPrefab Variantとして保存します。保存後のPrefabを編集する場合はPrefabをダブルクリックして編集画面を開くか、シーンで編集した後にApply Allで変更を適用します。こうすることで各衣装バリエーションのPrefabにも親Prefabの変更が適用されるので、各衣装バリエーションごとに同じ作業をするという虚無がなくなります。
衣装バリエーションの作成
衣装もポリゴン数多いケースがあるのでBlenderで湯通しします。ポリゴン削減がめんどくさい場合はCats Blender Pluginでお茶を濁すこともあります。
アバター同様に衣装もマテリアルの割り当てや見た目の調整、PhysBoneの設定を行ってPrefab化します。Prefab化した衣装をアバター内に配置してModular AvatarのSetup Outfitで着せます。さらに衣装を着せたアバターを新規のPrefab Variantとして保存します。
パフォーマンスランクの確認と最適化
VRChatアバター最適化・軽量化【脱Very Poor】を参照です。
ローカルテストとアップロード
とりあえずアバターをローカルテストします。問題なければアップロードします。
アバター名はアバター名 衣装名
にすることが多いです。Chiffon Dress
みたいな感じです。ただ、名前が長いと表示が途切れて衣装名がわからなくなる場合があるので省略して表記します。cfn dress
のような感じです。省略する場合は他アバターと名前が重複しないように注意しましょう。
サムネイルはシーン上に新規カメラを配置してそれを使って撮るようにしています。背景を用意するのがめんどくさいのでカメラのClear FragsをSolid Colorにし、いい感じの単色にします。顔面ドアップなら背景とかポーズとか関係ないのでこだわりなければオススメです。