📁

【VRChat】非破壊ツールによる"プロジェクトを壊さない"アバター改変

2024/10/04に公開

概要

アバター改変の際に「プロジェクトが壊れた」「アバターが復旧できない」といった悲劇を起こさないための個人的な工夫をまとめる。

文面だけだと分かりづらいためスライドも制作中 (現在3章まで)
https://www.figma.com/deck/5rcV8EHYPTqSR2VQH2xtYp

1. 作業用のフォルダを作る

触るときに"壊しても大丈夫なもの"と"壊したらだめなもの"を明確に分けるためにフォルダを作って、アセットはインポートした状態のままVariant化や複製以外では触らないようにする。
今後アセットをVariant化や複製したものは全て作業用フォルダに入れてその中でのみ改変を行う。

Assets直下で右クリック「Create」→「New Folder」、選択してF2を押して名前を「0_Workspace」などに変更、今後Variant化や複製したものはすべてこのフォルダに入れる。

2. アバターのVariant化

Prefab Variant化

アバターのPrefabを直接触って壊してしまうと、プロジェクト内の同一アバターの改変データも連鎖的に壊れて"プロジェクトが壊れる"。予防策としてアバターのPrefabをVariant化(派生)させて「派生元のPrefabには手を加えず、派生先のデータだけに影響が及ぶ状態」にする。

アバターのPrefabを右クリック「Create」→「Prefab Variant」でVariant化する。

Material Variant化

PrefabをVariant化したのと同様に、MaterialもVariant化することでMaterialを壊してしまった場合の被害が派生元にまで及ばない状態にする。Prefabに対して複数のMaterialがあると手作業では大変かつ差し替え忘れも起こりやすいためツールの使用を推奨。

アバターのMaterialを右クリック「Create」→「Material Variant」でVariant化したMaterialをPrefab VariantのMaterialと差し替える。

3. Expression MenuのPrefab化

MAによるMenuのPrefab化

Expression Menu(以降ExpMenu)をPrefab化してアバターへ一括適用することで、アバター別にExpMenuを作った際に生じるパラメーターのズレによるバグを予防する。
また、ExpMenuをPrefabにしておくことで特殊な改変の際にVariant化する選択肢もできる。

右クリックして「Create」→「Prefab」でPrefabを生成してダブルクリックで開き「MA Menu Group」と「MA Menu Installer」をAdd Componentする。

MA Menu Installerでどこからでも導入ができるのは便利だが、どこに何が入っているのか分からなくなりやすい。フォルダ分けによってモジュールを可視化して管理しやすくする。(例としてHand, Face, Cloth, Body, Othersと筆者は分類している)

HierarcyのPrefabを右クリック「Create Empty」でGame Objectを生成。「MA Menu Item」をAdd Componentして「Sub Menu」でフォルダにしたいExpMenuを選択した後「子オブジェクトから生成」にする。(フォルダの数だけ繰り返す)

4. 衣装やギミックのVariant化・Menu Item化

Prefab・Material Variant化

アバターと同様の手順でPrefab Variant化とMaterial Variant化を行い、派生元のデータへ影響がいかない状態にする。必要であればPosition・Rotation・Scale等の調整も行う。

MA対応がなされている衣装であればMA Menu Installerが標準でついているためフォルダとは別の場所にインストールされる場合がある。どのフォルダに入っているかを直感的に管理するためにMenu Installerを無効化して純粋なMenu Itemにする。

「MA Menu Installer」の「Extract menu to objects」ボタンを押した後「MA Menu Installer」を右クリック「Remove Component」でコンポーネントを消す。

5. アバターの組み立て

Variantの多層構造化と単一責任化

上記までのVariant化の目的は「素材となるアセットを壊さないようにすること」であり、目的が達成されたVariantは更にVariant化して派生させ、目的を達成済みのVariantはもう触らないようにする。
基本的に1つのVariantにつき1つの改変内容に絞ることで、もし壊れた場合でも被害は触っていたVariantの地点から後に限定されるため常に最小限のダメージで済み、どのVariantが壊れたのかで原因が特定しやすい。
今回は「アバターを組み立てること」を目的としたVariantを作る。

アバターのVariantを右クリック「Create」→「Prefab Variant」で更にVariant化をする。

アバターのPrefab Variantを編集して組み立てる

Prefab Variantの編集はシーンを移動して編集するよりも早く、変更が瞬時にPrefab Variantに反映されるため壊れる心配が少なく手軽な改変をしたい場合に便利。
オートセーブのためクラッシュに強く、保存のし忘れによるデータ損失なども起こりづらいため組み立てや着せ替えなど大きな変更の際は編集を用いる。

アバターの組み立て用Variantをダブルクリックで開き、直下にExpMenuのPrefabを入れた後にExpMenuのフォルダに衣装やギミックを追加する。共通化したい場合はExpMenuのPrefabをダブルクリックで開いてギミックを入れるとPrefabが入れられた全てのアバターに適用される。

6. アバターの動作テスト

アップロード前に動作テストをする

アバターのアップロードには数分~十数分かかる上にUnityとVRChatを同時起動する必要があり、アップロードして動かなかった時の損失や徒労感が強く、直前の作業を忘れたりなどの悪影響を回避するためアップロード前に動作テストをする。
もし想定通りに動かなかったとしてもテスト→修正までのサイクルが短くなることで、作業のモチベや精度を保ちやすい。

右クリック「Create」→「Scene」でシーンを作ってダブルクリックで開いてアバターのPrefab Variantをシーンに追加、左上のメニュー「Tools」→「Gesture Manager Emulator」で生成されたゲームオブジェクトを選択して「Enter Play-Mode」でテストする。

修正をPrefab Variantに適用する

Prefab Variantはシーンでの変更を適用(Apply)するか破棄(Revert)するか選ぶことができ、適用するまではVariantには変更の影響はないため壊れる心配がない。
もし動作テストで問題が起きてもシーン内であれば動くようになるまで思いつく手段を色々と試して、安全が確認された後に適用するなど柔軟に対応できる。

Prefab VariantのInspector左上にある「Override」から「Apply All」を押す

7. アバターのアップロード

アバター用シーンを開いてVRChat SDKの「Builder」タブから「Build & Publish」を押す。

8. アバターの最適化

アバター・衣装・ギミックなどに対してAvatar Optimizer(AAO)などでの最適化を行う。上位の階層のVariantで最適化を行うことで1度最適化を頑張ればそれ以降のすべてのVarinatに最適化が適用される。

9. アバターの改変

アバターを更にVariant化してExpMenuに衣装やギミックを入れるだけで改変は完了する。
このような「Variant化による可用性の担保と影響範囲の限定」や「衣装やギミックのMenu Item化による保守性・簡便性の向上」が"プロジェクトを壊さないアバター改変"に繋がる。

使用する非破壊ツール

Discussion