見出し画像

【VRChat】PrefabとModularAvatarを駆使して、アップデートに強いアバター改変環境を作る

2022/02/12 末尾におまけを追記

0.イントロダクション

以前、「アップデートでアバターが壊れるのでUnpackPrefabをするな」といった趣旨の記事を書きました。
(まだ読んでない方は以下から読めます)

で、タイトルに「活用することの効果」って書いておきながら、肝心のPrefabを活用したアバター管理方法について記事に書いていませんでした。
(文字数7000オーバーの記事なので書ききれなかったってのもあります)

なので今回は以下を主軸としたアバター改変について解説していきます。

  • アバターや衣装のUnpackPrefabを行わない

  • Prefabへのオーバーライドを活用した改変方法を行う

今回の記事ではセレスティアを例に出します。
マヌカという妹も持っていますが、とある理由で今回の記事にぴったりなのでこちらを起用します。

また、前提条件としてVCCではなくALCOMを使います。
ALCOMについては以下の記事を読んでください。

また、以下のシェーダー・ツールのリポジトリを入れておいてください。

一応書いておきますが、この記事の文字数は10000文字を超えてます。
太宰治の「走れメロス」と同じくらいの文字数なので気を付けてください。

最後に、この記事は2025年2月11日現在の情報で執筆しています。

1.プロジェクト作成と下準備

1-1 プロジェクト作成とパッケージ導入

さて、まずは今回の記事用にプロジェクトを作成します。
今回のプロジェクト名はPrefab_Note_Testbedとしました。

画像

プロジェクト名は何でもよいですが、過去記事で言った通りプロジェクト名や保存先のフォルダ名に日本語を使うのは避けましょう。

プロジェクトを作成したらUnityを開く前に、[管理]をクリックして以下のパッケージを導入します。

  • VRChat Package Resolver Tool
    入れ得なので入れておくこと

  • lilAvatarUtils
    liltoonと同じリポジトリから導入可能

  • liltoon
    UnityPackageではなくこちらから入れることを推奨

  • ModularAvatar
    UnpackPrefabせずに改変するためにほぼ必須

  • Non-Destructive Modular Framework(NDMF)
    通称なでもふ。ModularAvatarなどの前提フレームワーク

  • Gesture Manager
    アバターの動作確認で必須

画像
バージョンは多少違っても構いません

必要なパッケージを導入したら、Unityを起動させます。

画像

プロジェクトを開いたら以下の画像の通りにします。

  • SceneのSkyboxを無効にする
    (グリッドが見えにくくなることがあるため)

  • SceneのAlwaysRefresh(常に更新)を有効にする
    (これがOFFだとマテリアルの見え方が変わります)

  • シーンビューカメラのモードをIsoに切り替える
    (マテリアルの確認以外をやりやすくするため)

  • Hierarchyに元からあるライトを白一色にして180度回転させる
    (アバターの正面から照らす&色を正確に見るため)

画像

この辺はこちらの記事を参考にしてください。
(上に書いたことは一通り解説してます)

1-2 アバターのインポートとPrefabの確認

さて、下準備が出来たのでセレスティアのUnityPackageをダブルクリックするなり、Unityの画面にドラッグアンドドロップしてインポートしましょう。

この時、必ず「何がインポートされるか」「更新されそうになっているファイルがないか」を確認してください。

初心者にありがちなミスとして、「liltoon等のシェーダーをVCCやALCOMから導入している=Packageフォルダに既にインポートされているにもかかわらず、アバターに同梱されている古いバージョンのシェーダーをインポートしてしまい、プロジェクトが壊れる」といったミスがよくあります。

上から下まで漏れなく確認し、意図していない上書きが発生していないかを確認しましょう。

画像

インポートでのファイル更新は「ファイルの上書き保存」と同じ扱いになります。つまりCtrl+Zなどで元に戻すことは出来ません。
更新マークのような矢印が見えた時は要チェックです

インポートが終わったら今までならアバター付属のPrefabをHierarchyに配置して、「さあ改変するぞ」となるところですが、一旦待ってください。

ここでまず、アバター付属のPrefabが「PrefabVariant」か「PrefabOrigin」かを確認します。
ここでPrefabVariantであれば問題ないのですが、セレスティアの場合は以前の記事で触れたようにPrefabOriginになってしまっているパターンです。

画像

セレスティアに限らずUnity2019だとFBXからPrefabを作成する際にPrefabOriginの選択肢が選べてしまったので、この状態になっているアバターは他にもあります。

というわけで、この状態だと仮にFBXにアップデートがかかってしまった場合はアバターが壊れます。
なので今回はまず、FBXを元にPrefabVariantを作成し、そのPrefabVariantからさらに派生で衣装着せ替え用のPrefabVariantを作成します。

2.FBXからPrefabVariantを作成する

2-1 CopyComponentByRegexの導入

「FBXからPrefabVariantを作成します」と一言で言っていますが、イチからやろうとすると設定項目が膨大すぎます。

FBXを元にアバターを作れという無茶振り

になってしまうので、以前Blenderの体型改変記事で使用したCopyComponentsByRegexを使用しましょう。
導入については以下の記事を参考にしてください。

ダウンロードしたらプロジェクトのアセットフォルダにコピーして導入します。

画像

Hierarchyを右クリックして、メニューにCopyComponentsByRegexが出てきたら成功です。

画像

2-2 アバターの付属PrefabからFBXにコピーする

次にFBXをHierarchyにドラッグアンドドロップします。
大抵の場合はアセットフォルダの「FBX」と名前の付いているフォルダにFBXが存在します。

これは前回の記事で解説したFBX(モデルデータ。メッシュとArmatureの複合体)でしかないので、いわば魂のない肉人形のようなものです。

画像

これをアバターとして使うためにはAvatorDescriptorというコンポーネントをつけたり、リップシンクや目のボーンの設定をしたりする必要がありますが、今回はCopyComponentsByRegexに任せて、元のPrefabから全コピーします。

Hierarchyにアバター付属のPrefabを配置して、Hierarchyに置いたPrefabを右クリックしてCopyComponentByRegexをクリックしましょう。

画像

CopyComponentByRegexの画面で、①「コピー先にオブジェクトがなかったらオブジェクトをコピー」にチェックを入れて、上の方の②Copyをクリックします。
③の「コピー中のオブジェクトの部分」にPrefabの名前が表示されたこと=Prefabの中身がすべてコピーされたことを確認しておきます。

画像

次に、HierarchyでFBXをクリックして、Pasteをクリックします。

画像

これでコピペが完了です。以下の画像のようになったことを確認しましょう。

  • AvatorDescriptor(アバターとしてアップロードするために必要なコンポーネント)がコピーされたこと

  • Scene画面でPhysBoneなどを示す線(緑や青の球体)が見えるようになったこと

大丈夫そうなら、Hierarchyに置いた元のPrefabは削除してOKです。

画像

メニューバーのTools(ツール)からGestureManagerEmulatorを呼び出し、動作チェックを行います。これはあくまで「アバターとして動くか」のチェックです。

画像
HierarchyにGestureManagerというゲームオブジェクトが出現したら、これを選択してプレイモードに入ります

Option⇒Locomotion⇒Velocityで移動モーションをぐりぐり動かしたり、表情が動作すればOKです。
満足したらプレイモードを終了させましょう。

画像

さて、これでFBXからアバターを作成したので、自家製のPrefabとして保存しましょう。

2-3 作成したアバターをPrefabVariantとして保存する

さて、では作成したアバターをPrefabVariant(壊れないPrefab)として保存しましょう。そのまま付属のPrefabフォルダに入れても良いですが、別でフォルダを作っておくと混乱が避けられます。
今回は"00_Prefab"というフォルダを作成しました。

画像

フォルダを作成したら、Hierarchyにあるアバターの名前を変えておきましょう。
今回は分かりやすいように"_Base"と末尾に付けて、"SELESTIA_Base"としておきます。

画像

名前を変更したら、HierarchyにあるSELESTIA_Baseを、アセットフォルダのPrefabを保存したいフォルダ(今回は00_Prefab)にドラッグアンドドロップします。

画像

これでPrefabVariantが出来ました。
アイコンがただの青い立方体ではなく、陰のある青色の立方体(PrefabVariant)になっていることが分かると思います。

画像
画像
上がPrefabVariant(アバターで好ましいPrefab)
下がPrefabOrigin(アバターで好ましくないPrefab)
※以前の記事から引用

次に、HierarchyにあるSELESTIA_Baseをクリックします。
ここのアイコンもFBXの段ボール箱アイコンからPrefabVariantのアイコンに変わっていて、Inspectorのプレハブの向き先も先ほど作ったPrefabVariantに向き先が変わっています。

画像

これでPrefabVariantの作成は終わりました。
今の状態を整理しましょう。

補足:今の状態の整理と"ネスト状のプレハブ"について

図解するとこんな感じです。アバターに付属しているPrefabは使わず、自分でFBXからPrefabを作成した状態になります。

画像

そしてこの後ですが、SELESTIA_Baseから着せ替え用に服を全て脱がせたPrefabVariant(SELESTIA_Kisekae)を作成し、そこから衣装を着せていくといった形にします。図解すると以下のようになり、このように階層化された構造をネスト状のプレハブ(NestedPrefabs)と呼びます。

画像

3.着せ替え用のPrefabを作る

では、着せ替え用のプレハブを作っていきましょう。
まず、HierarchyにあるSELESTIA_Baseの名前をSELESTIA_Kisekaeに変えておきます。名前を変えただけなので、まだプレハブの向き先(赤枠)はSELESTIA_Baseのままです。

画像

次に、HierarchyにあるSELESTIA_Kisekaeアセットフォルダにドラッグアンドドロップします。
ダイアログが出てくるので「プレハブバリアント」をクリックしましょう。

画像

アセットフォルダにSELESTIA_Kisekae VariantというPrefabVariantが出現しました。Inspectorの「バリアント親」の部分はSELESTIA_BaseのPrefabVariantになっています。

画像

名前の後ろにVariantとついていなくてもアイコン見ればわかるので、名前は変えてしまってよいです。
ついでに、プロジェクト画面右下のバーを一番左にしておきましょう。こうするとファイル名が全て見えます。

画像

これでとりあえず、変更を加えていないPrefabVariantが出来ました。
変更作業に入る前に、ネスト状のプレハブの利点とルールについて解説します。

補足:ネスト状のプレハブの利点とルール

画像
ついさっき見た画像ですがもう一度

上の方の画像をまた引っ張ってきました。
このネスト状のプレハブには、主に以下のような利点とルールがあります。

  1. 親のPrefabで行った変更をオーバーライドすると、子のPrefabに引き継がれる
    例えばSELESTIA_BaseにましゅまろPBを導入してオーバーライドすると、その子であるSELESTIA_KisekaeにもましゅまろPBが追加され、更にその子供たちであるSELESTIA_A、SELESTIA_B、SELESTIA_CにもましゅまろPBが追加されます。

  2. 親のPrefabで削除したものは子のPrefabで使えない
    Unity2022では、今までのUnity2019と違いPrefab内のゲームオブジェクトを削除できるようになりました。削除するとHierarchyが整理できますが、削除した状態でオーバーライドしたオブジェクトは子のPrefabからも削除されます。
    例えば「着せ替えするなら元の下着は使わないでしょ」と思って削除した状態でSELESTIA_Kisekaeにオーバーライドをします。そして、SELESTIA_Aに「元のアバターに付属している下着を使う前提の衣装」を入れた場合、SELESTIA_Aでは下着をONにするといったことが出来ません。
    こういった「基本的には使わないけど、もしかすると子で使うかも」といった物は非アクティブ化+EditorOnlyにしておくのが無難です。

  3. 子のPrefabでの変更は、子のPrefabだけにオーバーライドするか、遡って親までオーバーライドするか選べる
    一通り作業してオーバーライドした後、「この変更を全部のアバターに反映させたいな」といった場合があるとします。
    その場合は親のPrefab(SELESTIA_Kisekae)やさらに親のPrefab(SELESTIA_Base)まで遡って適用させることが可能です。

一通り説明しましたが、文字だけでもピンと来ないとは思います。
上に書いたルールは頭の片隅に置いておいて、作業手順の解説に戻りましょう。

「オーバーライドって何?」って人は前回の記事を読み返してください。

3-1 着せ替え用のPrefabから不要なオブジェクトを削除する

では、HierarchyにいるSELESTIA_Kisekaeから不要なオブジェクトを消して行きましょう。
まず、グローブとメインのワンピースを選択して、Deleteキーで削除します。右クリックから削除しても良いです。

画像
この二つを
画像
こう

次に、衣装によっては使うかもしれない物を非アクティブ+EditorOnlyにしておきましょう。
ストッキング、靴、下着を選択して、Inspectorのチェックボックスをオフにし、タグの部分をEditorOnlyにしておきます。

画像
一応局部を伏せておきます

ここまでで不要なオブジェクトの削除が終わりましたが、セレスティアにはデフォルトで衣装のON/OFFギミックがついています。
着せ替えをするのであればこれらのギミックは「Unityでは正常なのに、VRChatに入ると腕が細くなる」などの原因になるので取り除いておきましょう。

4.改変に適した形にメニューとFXレイヤーを造り変える

4-1 ExpressionMenuをHierarchyで管理できる状態にする

まずはじめに、アバターのメニューを整理しましょう。
「じゃあExpressionMenuを開いて…」と思ったそこのアナタ、その方法でもよいですが、今回はExpressionMenuをHierarchyで管理する方法についても解説します。

HierarchyのSELESTIA_Kisekaeを右クリックして、ExtractMenuをクリックします。

画像

青枠の部分、HierarchyにAvatarMenuという項目が生まれました。
これがアバター本体のExpressionMenuをHierarchyに出力したものです。
同時に、AvatorDescriptorのExpressionMenuの部分(赤枠)が「~ExpressionMenu placeholder」というものに置き換わっています。

画像

この操作を行うことで、アバター付属のメニューファイルではなく、Prefabの中でメニュー項目の管理を行うことが可能になります。
これにより、もしアバターのメニューファイルがアップデートで更新されたりしても、影響を受けにくくなります。
詳しくは以下のページを見てください。
https://modular-avatar.nadena.dev/ja/docs/tutorials/menu

HierarchyでAvatar Menuを見てみると、セレスティアに標準で付いてきている着せ替えギミックが出てきました。赤枠の部分を見るとわかりますが、まだこの項目はメニューファイルの中を見ています。

画像

なので、下の方にあるオブジェクトに展開を押しましょう。こうすることでサブメニューの中身もHierarchyで管理することが出来るようになります。

画像

すべて展開すると以下の画像のような状態になると思います。
この部分はアバターによって異なるので注意してください。ModularAvatarのチュートリアルだと竜胆で説明されています。

画像

ここまで弄ったら、アバターのルートオブジェクトをクリックして、オーバーライドをしておきます。変更した部分に間違いないことを確認して、「すべてを適用する」をクリックしましょう。

画像

これにより、一旦今の状態がPrefabの中に保存されました。

画像

では不要な項目を整理していきましょう。
まずSELESTIA_costumeの中にあるTopは衣装を消しているので不要です。これはDeleteキーで消しましょう。
それ以外のものは…ひとまずEditorOnlyにしておきましょう。

画像

4-2 着せ替え用のFXレイヤーの作成・編集

次にFXレイヤーを編集します。
まず、アバターに割り当てられているFXレイヤーをCtrl+Dで複製して、複製で出来た方の名前の末尾に_Kisekaeと付けておきます。

画像

作成したSELESTIA_FX_Kisekaeを、SELESTIA_KisekaeのFXレイヤーにセットしておきましょう。

画像

では、着せ替え用のFXレイヤーを編集していきます。
SELESTIA_FX_Kisekaeをダブルクリックしてアニメーター画面を開いてください。

画像

この時、画像赤枠の部分(開いているアニメーターのファイル名)が一致しているのか確認しましょう。

アニメーターを開いたら、画像赤枠で囲った部分のレイヤーをすべて削除します。セレスティアの場合はこの部分で素体のシェイプキーを制御しているので、この部分が残っていると「アップロードした時に体が細くなる」「Unity上と胸のサイズが変わってはみ出る」って原因になります。

画像

ここまで終わったらGestureManagerで動作チェックしましょう。

画像

RadialMenuでCostumeを開くと、Hair acc(ヘアアクセ)だけ残ってます。
こういった感じで、Hierarchyで消したものは連動してメニューからも消えてくれます。

画像

ついでに胸のサイズ可変ギミックもチェックしましょう。
メニューでダイヤルを操作しても胸サイズが変わらないことが分かると思います。つまりUnityで設定した通りの数値がVRChatにも反映されます。

画像

ここまで確認が終わったら動作確認はOKです。再生モードを終了させて、またアバターにオーバーライドをしておきましょう。
ついでにヘアアクセのメニューをEditorOnlyにして、胸サイズ変更のメニューは消しておきました。

画像

5.着せ替え用のPrefabを用いて服を着せる

ここまでで下準備が終わりました。
ではここからは実践編で、衣装を着せる場合の手順を説明します。
今回は例として、この衣装を使用します。

まずは衣装をインポートします。
アバターの時と同じく、インポートされるものが全てNewかどうかを確認しておきましょう。

画像
「UTS」って文字が懐かしいですね

インポートが終わりました。インポートが終わったら、衣装のPrefabをHierarchyにいるSELESTIA_Kisekaeにドラッグアンドドロップします。

画像

ここから先はModularAvatarのチュートリアルと一緒なので要所だけ説明します。

衣装のルートオブジェクトを右クリック⇒SetupOutfitしておきます。
ついでに衣装についているAnimatorは右クリックしてRemove Componentしておきましょう。

画像

GestureManagerで確認してみましょう。
ちゃんと追従していますね。

画像

ここまで終わったらPrefabをオーバーライドしたくなってしまうんですが、この状態でオーバーライドすると全部のアバターに反映されてしまうので厄介なことになります。

プレイモードを終了したら、HierarchyにいるSELESTIA_Kisekaeの名前を変更しましょう。Kisekaeの部分を衣装名にするのが無難だと思います。

画像
今回はSELESTIA_SShirtB"としておきます

名前を変更したらVariantを作成します。
プロジェクト画面でSELESTIA_Kisekaeの置いてある場所を開いて、HierarchyにいるSELESTIA_SShirtBをドラッグアンドドロップします。

画像

ダイアログが出てくるのでプレハブバリアントをクリックしましょう。

画像

これでPrefabVariantが作成されました。
インスペクターで三本線のボタンを押すとBase⇒Kisekae⇒SShirtBの順で継承されていることが分かります。

画像

この部分については以下の記事の「1-3.Prefabの親子関係とオーバーライドについて見てみよう」で解説しています。

あとは、普通にアップロードしましょう。
アップロードが終わった後にやることがあります。

画像

アップロードが終わったら、最後にもう一度Prefabのオーバーライドを行います。
更新対象にPipeline Managerが入っていますね。これも衣装側のアバターで保持しておきたい情報なので、この状態でオーバーライドします。

画像

PipelineManagerについてはこの記事を読んでください。
簡単に言うと、VRChat上のアバターとUnityのアバターをリンクさせるためのID(Blueprint ID)を保持しておくコンポーネントです。

ここまでで衣装を着せる作業の解説は終わりです。
次回以降は以下の手順を守りましょう。

  1. まず着せ替え用のPrefabをHierarchyに置く

  2. ModularAvatarを使ってアバターに衣装を着せる

  3. アバターの名前をリネームしVariantとして保存する

6.アバターに後からギミック(ましゅまろPB)を導入する

では次に以下の状況を想定しましょう。
今回は「アバターに後からましゅまろPBを導入する」といった場合を想定します。

まずはましゅまろPBにインポートしましょう。
これも同じくインポートの時はよく確認してください。

画像

ついでですがこれも入れておきましょう。
「あれ?今インポートした衣装どこ行った?」ってのが防げます。

ましゅまろPBをインポートしました。
SELESTIA_Baseのアバターを右クリックしてましゅまろPBを導入したら、アバターのルートオブジェクトからオーバーライドするか、もしくは右クリック⇒Added GameObject⇒プレハブ'SELESTIA_Base'のオーバーライドとして適用をクリックします。

画像

右クリックからAdded GameObjectをクリックすると、自分より親のPrefabに対して適用することもできます。
ただし、FBXに適用(オーバーライド)することは出来ません。

こうすると、以下のようになります
①親となるSELESTIA_BaseにましゅまろPBが追加された
②画面上にはいないSELESTIA_Kisekaeに継承される
SELESTIA_Kisekaeの子であるSELESTIA_SShirtBに継承される

画像

このような感じで、親に対して加えた変更を親にオーバーライドすると子にも反映されます。逆に子供にだけアクセサリを付けたい場合などは衣装と同じように子でオーバーライドすればよいです。

7.まとめ

今回のまとめです。

  • 付属しているPrefabがPrefabOriginだったら、まずPrefabVariantにしよう!FBXの更新が来たときに壊れなくなるぞ!

  • 着せ替え用のPrefabVariantを別で用意しておくと便利だぞ!

  • 衣装を着せた後のPrefabはVariantとして保存しよう!

おまけ:参考になるかもしれない他の記事(2025/2/12追記)

オマケですが、個人的におススメの記事を何個か貼っておきます。
主にアニメーションの基礎やSceneファイルについての記事です。

ExpressionParameterやAnimatorの基礎知識

Avatar3.0が出たころ(所謂SDKが3.xになった時)の記事ですが、基本的なルールはこの記事が出たころからほとんど変わっていません。
RadialInventorySystemやModularAvatar等も、あくまでこのルールに従って動いているにすぎません。

Sceneファイルについて

今回はPrefabの話しかしていませんが、このSceneファイルの管理についても重要です。
保存した場所を自分で覚えておく必要があるので意識しましょう。

AnimationのMissingについて

表情などのAnimationファイルは、対象となっているメッシュの階層が変わるとMissing(対象を見失った)状態になり動かなくなります。
ついでにMissing状態を修正してくれる方法についても解説されています。

アバターマスクや状態遷移について

自作アバターで~とは書いていますが、ModularAvatarをフル活用しようとすると、どうしても手でAnimatorを弄る必要が出てくる場面があります。
以下の記事の内容も把握しておいてください。

何かあればまた追記します。

いいなと思ったら応援しよう!

ピックアップされています

VRC改変ノウハウ

  • 2本

VRC

  • 3本

コメント

ログイン または 会員登録 するとコメントできます。
Blenderで乳とタッパとケツを盛る一日を過ごしています。
【VRChat】PrefabとModularAvatarを駆使して、アップデートに強いアバター改変環境を作る|よぜ
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1