VRChat アバタープロジェクト向けの、アバター単位マテリアル分離ツール。
1 つの Unity プロジェクトに複数のアバターを入れていると、Material / Texture が共有参照になっているせいで、アバター A のために調整した変更がアバター B にも勝手に反映されてしまいます。xestrel は選択したアバターの Renderer 階層を走査して:
Material を Assets/Xestrel/<アバター名>/Materials/ 以下のアバター専用コピーに置き換え、Renderer.sharedMaterials を差し替えます。Isolate ボタンで一括実行されます(ボタンにはコピー対象の共有マテリアル数が表示されます)。Assets/Xestrel/<アバター名>/Textures/ にコピーして差し替えます。Isolate All Textures でマテリアル内の全スロットを一括分離もできます。分離していないテクスチャは共有元を参照したままで、分離済みスロットには Restore ボタンが出ます。AnimatorController 単位・オンデマンド。ウィンドウの Animators セクションには、まだ共有コントローラーを指している VRCAvatarDescriptor の Playable Layer が一覧表示され、ワンクリックで Isolate できます(オブジェクトフィールドに任意のコントローラーを入れることも可能)。コントローラーは Assets/Xestrel/<アバター名>/Animators/ へ、参照されている AnimationClip(ステート・サブステートマシン・ブレンドツリー)は Assets/Xestrel/<アバター名>/Animations/ へコピーされ、コピー側コントローラーはクリップコピーを使うよう書き換えられます。元のコントローラーが Descriptor の Playable Layer から参照されていた場合は、その参照もコピーに差し替わります。元のアセットには一切手を付けません。アバタールートに XestrelMaterialIsolation コンポーネントが追加され、すべての 元 → コピー の対応を記録します。VRC.SDKBase.IEditorOnly を実装しているため、VRChat アップロード時には除去されます。
Unity 2022.3 LTS、VRChat Avatars SDK 3.5+。NDMF / Modular Avatar / Avatar Optimizer との連携はありません — xestrel が触るのは Renderer.sharedMaterials だけです。
このディレクトリを Unity プロジェクトの Packages/net.yozolab.xestrel/ にコピーまたはシンボリックリンクしてください。エディタを開くと Xestrel.Runtime.dll と Xestrel.Editor.dll にコンパイルされます。
Assets/Xestrel/<アバター名>/Materials/ に作られ、レンダラーが差し替わります。Folder ボタンで Project ウィンドウ内のそのフォルダーを表示できます。Assets/Xestrel/<アバター名>/Textures/ にコピーされて差し替わります。Isolate All Textures で全スロット一括も可能。分離済みスロットは ● マーク付きで、Restore で個別に戻せます。Window → Xestrel → Dependencies(または分離ウィンドウの Deps ボタン)で、アバターの依存関係がインデント式のツリーで開きます。第1リングは汎用的に発見されます — 階層内の全コンポーネントのシリアライズ済みオブジェクト参照をすべて走査するため、Modular Avatar / VRCFury / オーディオ / メッシュ / メニューへの参照も型ごとの対応なしで現れます。各行の ▸ n ボタンでそのアセット自身の直接依存が展開されます(インポートパイプライン経由なので軽量)。種別トグル(Mat / Tex / Mesh / Anim / Clip / Menu / Shader / Prefab / Other)、Assets/ 外を隠す No Pkg トグル、検索ハイライトで一覧を読みやすく保てます。分離状態は行頭の色ドットです: 橙=まだ共有(隔離可能)/ 緑=隔離済みコピー / 赤=他ワークスペースのマニフェストも参照しているコピー(バッジにワークスペース名を表示。未ロードのシーンでも検出)/ グレー=xestrel の管理対象外。各行にはプライマリアバターに対する Isolate / Restore ボタンがインラインで付き、名前クリックで Ping します。Add Selected で複数のアバターをルートに追加でき、複数のアバターから参照されているアセットには ×n avatars バッジが付きます。
Assets/Xestrel/ 以下のフォルダ名は、アバターを最初に分離した時点で確定します。以後 GameObject をリネームしても安全で、既存・新規のコピーは元のフォルダに入り続けます(どのフォルダかはステータス行に表示されます)。 (n) サフィックスが付きます。同じプレハブを複数のシーンに置いたり、1つのシーンに2体置いたりしても、それぞれが独立したワークスペースになります。Assets/Xestrel/<AvatarName>/XestrelWorkspace.asset も保存されます。正はあくまでアバター上のコンポーネントで、マニフェストはコンポーネントを失っても original → copy の対応が生き残るための保険です。Assets/Xestrel/ 以下のワークスペースフォルダをリネームしても自動で追従します。ワークスペースは新しいフォルダ名を引き継ぎ、新規コピーも既存コピーの隣に入り続けます。AssetDatabase.CopyAsset で作られる素の .mat アセットです(Material Variant ではありません)。元とは完全に独立します。AssetDatabase.CopyAsset を使うため、インポーター設定(圧縮・sRGB・ミップマップ等)が引き継がれます。モデルのサブアセット(FBX 埋め込みなど)やディスク上にアセットがないもの(RenderTexture など)は警告付きでスキップされ、コピー側マテリアルの参照は元のままになります。AssetDatabase.CopyAsset を使うのでサブアセット(ステート・ブレンドツリー・トランジション)ごとコピーされ、その後 xestrel がコピーを走査してすべての Motion 参照をクリップコピーに書き換えます。FBX / モデルアセット埋め込みのクリップと AnimatorOverrideController は対象外です。Runtime/ — マテリアル / テクスチャ / アニメーター / クリップのバインディングを持つ XestrelMaterialIsolation MonoBehavior(IEditorOnly)Editor/Core/ — ログ・パスヘルパーEditor/Detection/ — アバタールート解決(VRCAvatarDescriptor)Editor/Isolation/ — マテリアル / テクスチャ / アニメーターのコピーファクトリと分離サービスEditor/UI/ — EditorWindow + Hierarchy コンテキストメニューEditor/Inspector/ — MonoBehavior 用カスタムインスペクターTests/ — Editor Test Runner スイートnet.yozolab.xestrel
未設定
0.1.0
2022.3 以降
なし
なし
Yozolab