lilToon が適用されたアバターのマテリアルを、ARLitToon(ALTIMA/ARLitToon)へ非破壊で変換する Unity Editor 拡張です。
概要
- 元のマテリアル・テクスチャは一切変更しません。変換結果はすべて出力フォルダに新規作成されます。
- アバターは複製してから変換後マテリアルを割り当てます(元アバターはそのまま残ります・Undo 可)。
- lilToon の「2nd テクスチャ+別マスク」「マスク付き MatCap」など手動移植が難しい設定を自動でマッピングします。
- 自動変換できなかった機能は変換レポートにすべて明記します(黙って欠落させません)。
- 本ツールは ARLitToon シェーダー本体とは別の付属ツールです。
- lilToon はプロパティ名の読み取りにのみ参照し、lilToon 本体のコード・アセットは含みません・変更しません。
- 対応シェーダー版: ARLitToon v48_GUIr0(それ以前の版でも動作します。存在しない項目は自動でスキップ)。
- 本ツール自身のバージョン: v7_GUIr0(更新履歴は末尾「バージョン(更新履歴 / Changelog)」節を参照。上記の「対応シェーダー版」とは別の番号です)。
導入
対応 Unity: 2022.3 LTS(VRChat SDK3 環境を想定)。ARLitToon シェーダー本体(ALTIMA/ARLitToon)をプロジェクトへインポート済みにしておく。
- このフォルダ(本 README と
Editorフォルダが入ったもの)を Unity プロジェクトのAssets/ALTIMA/ARLitToonConverter/などへコピーする(Editor/ARLitToonConverter.csが Editor フォルダ配下にあれば場所は任意)。 - メニュー Tools → ALTIMA → ARLitToon Converter (lilToon から変換) で起動する。
使い方
ウィンドウ上部の 日本語 / English で表示言語を切り替えられます(初回はシェーダーの Inspector と同じ言語で開きます。変換レポートは日本語のみです)。
- ウィンドウの「アバター (ルート)」に Hierarchy のアバターをドラッグ。
- オプションを確認(既定のまま推奨):
- アバターを複製して変換する: ON で
〇〇_ARLitToonという複製に変換結果を割り当て、元は非アクティブ化(Undo 可)。 - マスクテクスチャを焼き込んだ合成テクスチャを生成する: ON で「2nd テクスチャの別マスク」等をアルファへ合成した PNG を自動生成。メインカラー2nd が「マスクだけ」の構成では、この設定が OFF だとマスクが効かず見た目が崩れます(下記「メインカラー2nd(Texture Layer)の合成モードについて」を参照)。ON のままを推奨します。
- 落ち影マテリアルの変換: 下記「落ち影専用(FakeShadow)マテリアルの変換について」を参照。
- 変換後のアバターから Pipeline Manager を外す: ON で、変換後のアバターから Pipeline Manager(アップロード先を指す Blueprint ID)を外します(既定 ON)。付いたままだと元アバターと同じアップロード先を指すため、変換後をアップロードすると元のアバターを上書きしてしまいます。「アバターを複製して変換する」が ON のときだけ働き、OFF のときは元アバターそのものなのでこの設定にかかわらず触りません。他のコンポーネントから必須指定されていて外せない場合は、Blueprint ID だけを空にします(どちらになったかはレポートに出ます)。
- 変換後のアバターを Prefab として保存する: ON で、変換済みのアバターを Prefab アセットとして書き出します(既定 ON)。保存先の既定は上の「出力フォルダ」と同じです(
_2,_3… が付いた場合もそちらへ保存します)。既定に戻すで追従状態へ戻せます。同名の Prefab があるときは別名で保存するため、既存の Prefab を上書きすることはありません。結果は必ず変換レポートに出ます(保存できた場合はパス、できなかった場合は理由)。 - 出力フォルダ: 既定は
Assets/ALTIMA/ARLitToon_Converted/<アバターの Prefab 名>/(Prefab インスタンスの場合は Hierarchy 上の名前ではなく元 Prefab アセットの名前を使います)。この既定値はアバターを差し替えると自動で追従します(自分でパスを書き換えた場合は、その値が優先されます。既定に戻すで追従状態へ戻せます)。同名のフォルダが既にある場合は_2,_3… を付けた新しいフォルダに出力します(変換のたびに結果が独立し、前回の生成物と同じフォルダに混ざりません)。実際の出力先は完了ダイアログと変換レポートの先頭に表示されます。
- アバターを複製して変換する: ON で
- 「アバターを変換する」 を押す。変換後のアバターは Prefab としても保存されます(既定 ON)。保存先のパスは変換レポートに出ます。
- ウィンドウ下部の変換レポート(出力フォルダにも .txt で保存)を確認し、「[注意]」項目があれば該当箇所を手動調整する。変換しなかったマテリアルは 「スキップしたマテリアル」セクションにまとめて表示され、理由と、アバター内のどこで使われているか(GameObject パス/スロット番号)まで確認できます。
Project ビューでマテリアルを選択してマテリアル単体だけ変換することもできます(シーンへの割り当てなし)。
主な変換マッピング
| lilToon 側 | ARLitToon 側 |
|---|---|
| メインテクスチャ / 色 / 色調補正(HSV) | Albedo / Color / Hue・Saturation・Brightness |
| 2nd テクスチャ(色・合成モード・別マスク) | Texture Layer(別マスクはアルファへ焼き込み/マスクだけの構成はマスクをアルファへ焼き直し) |
| アルファマスク(+透過率調整 Scale/Value) | Texture Layer 透明マスク(透過率調整はマスク画像へ焼き込み)/ メインテクスチャのアルファへ焼き込み |
| 影(色 / 強さ / 境界 / ぼかし)・2 影 / 3 影・境界の色づけ・明るさ上限下限 | Lighting & Shadow / Toon Shadow(2 影・3 影・境界の色づけ)/ Light Limit |
| シャドウ受光(落ち影の受け取り ON/OFF) | Receive Shadow(設定がある場合のみ引き継ぎ。無い場合は ARLitToon の初期値=v48_GUIr0 以降は OFF。ON を引き継いだときはレポートで注意をお知らせします) |
| 落ち影専用シェーダー(FakeShadow)のマテリアル | Fake Shadow Mesh(影用メッシュはそのまま利用・下記参照) |
| ノーマルマップ / 反射(Smoothness・Metallic 等) | PBR(BRDF) |
| 発光(色 / テクスチャ / マスク / スクロール / 点滅) | Emission(マスクは Emission Map のアルファへ焼き込み〔ラメのマスクと取り合うときは RGB へ〕・点滅はパルスに近似) |
| MatCap(1枚目 / 2枚目 / 各マスク・合成モード) | Matcap 1・2・3 + 領域マスク(下記参照) |
| メインカラー2nd / 3rd で UV Mode = MatCap を選んでいる場合 | Matcap スロット(Texture Layer ではありません・下記参照) |
| リムライト(色 / ライティングを適用 / テクスチャ) | Rim Light(強さ・太さは変換後の既定値に設定・下記参照)+ Rim Env Adapt + Rim マスク(テクスチャの明るさから生成) |
| リムシェード(縁を暗くする / マスク) | Rim Shade(色・太さ・濃さ・マスク)。ARLitToon が v47_GUIr0 以前なら Rim Light の Multiply モードで近似(下記参照) |
| ラメ(Glitter・色 / 強度 / 色・マスクのテクスチャ) | Glitter Sparkle(粒の形状・密度は要調整・マスクは Emission Map のアルファへ焼き込み) |
| UV スクロール(メイン / 2nd / 発光) | 各スクロール(同じ速度になるよう換算) |
| 逆光(Backlight・色 / 強度 / 背後指向) | Back Light(広がりは Width で微調整) |
| 距離フェード(近距離で指定色へ・色モード) | Distance Darken(色 / 距離 / 強度) |
| アウトライン(色 / 太さ / 幅マスク / ライティング) | Outline + Outline Mask |
| レンダリングモード(不透明 / カットアウト / 半透明) | Blend Preset(Opaque / Cutout / Fade 相当) |
反射・ハイライトの変換について
ARLitToon はライティングが物理ベース(PBR)です。変換元とは仕組みが違うため、次のように扱います。
- メタリックマップ(一部だけ金属にする指定)が設定されている場合は、
Metallicを0にします。ARLitToon にはメタリックマップのスロットがないため、数値だけを持ち込むと全面が金属になり、拡散光を失ってマテリアルが黒くなります。領域を絞る情報が失われる以上、金属にしない側へ倒しています。金属パーツが必要な場合は、変換後にMetallic/Reflection Strengthを手動で設定してください(レポートに[注意]が出ます)。 - 環境反射が
0なのにMetallicだけ高いマテリアルも、Metallicを0にします。映り込む先が無いまま拡散光だけが失われ、やはり黒くなるためです(物理的にも成立しない組み合わせです)。金属として見せたい場合はReflection Strengthを上げてからMetallicを戻してください。 - 変換元で「反射」を使っていないマテリアルは、環境反射を明示的に OFF(
0)にします。ARLitToon のReflection Strengthは新規マテリアルの初期値が1(映り込みあり)のため、何もしないと反射を使っていなかった素材にも映り込みが乗ってしまいます。これを防ぐための処理です。 Specular Highlightは常に0(物理そのまま)にします。この項目は ARLitToon では「光源ハイライトの上乗せ」(0で物理どおり・1で約 5 倍)であり、変換元の「スペキュラを使う/使わない」のスイッチとは意味が違います。物理ベースのハイライトは最初から出るため、上乗せはしません。- 変換元でスペキュラを OFF にしていた場合でも、ハイライトを完全に消すことはできません(物理計算の一部として出るため)。目立つときは
Smoothnessを下げて調整してください。この場合はレポートに[注意]として出ます。
メインカラー2nd(Texture Layer)の合成モードについて
変換元のブレンドモードは 通常 → Normal / 加算 → Add / スクリーン → Screen / 乗算 → Multiply とそのまま対応づけます。2nd テクスチャがある構成(マスクの有無を問わず)はこの対応どおりです。
メインカラー2nd にテクスチャが無く、マスクだけが設定されている場合(色 × マスクで使う構成)だけは、扱いが変わります。
- マスク画像を「RGB = 白 / アルファ = マスク」に焼き直した画像を生成して割り当てます(Tiling / Offset もマスク側の値を使います)。ARLitToon の Texture Layer はレイヤーテクスチャのアルファを合成マスクとして読むため、グレースケールのマスク画像をそのまま割り当てるとマスクがまったく効かず、さらに乗算ではマスクの黒い領域で下地が暗く落ちます。焼き直すことで「マスクの白い領域だけに 2nd カラーを乗算する」という変換元の挙動と一致します。この生成には「マスクテクスチャを焼き込んだ合成テクスチャを生成する」が ON である必要があります(OFF のときはマスクをそのまま割り当てたうえで、見た目が崩れる旨をレポートで警告します)。
- 合成モードは
Multiply(乗算)を既定にします。 この構成は下地に柄・汚し・陰影を乗せる使い方が主で、Normalだとマスク領域の中で下地の陰影やテクスチャが失われ、貼り付けたように浮いて見えるためです。乗算なら下地の明暗を残したまま乗ります。 - 下地を塗りつぶしたい場合は、変換後に
Blend ModeをNormalに変えてください(Normalはマスク領域を Layer の色で置き換えます)。レポートにも同じ案内が出ます。
テクスチャもマスクも無い(色だけの)2nd レイヤーは、対応する機能がないため変換せずレポートで通知します。
ガラス材質(屈折)の変換について
変換元の描画モード 「[高負荷] 屈折」「[高負荷] 屈折ぼかし」 と Gem はガラス材質の表現に使われるため、ARLitToon の Transparent プリセット(ガラス・素材の質感用)へ変換します(通常の半透明は Fade プリセットです)。
- メインカラーのアルファは
10/255に設定します(元の値は引き継ぎません)。変換元の屈折シェーダーはアルファに255が入っていても屈折効果で透けて見えるため、その値をそのまま持ち込むと ARLitToon では不透明の白い板になってしまいます。屈折そのものは再現できないので、ガラスらしく見える薄いアルファを出発点として与えます。濃さはメインカラーのアルファで調整し、映り込みが欲しい場合は PBR(BRDF) のReflection Strength/Fresnel Power/Fresnel Minを上げてください。 - 屈折(背景が歪んで見える効果)そのものを再現する機能はありません。
MatCap マスクの変換方式
ARLitToon の MatCap マスクは「白=そのスロットを適用」の領域選択方式です。lilToon の「適用範囲マスク」とは方式が異なるため、次のように変換します。
変換先のスロットは 3 つです(ARLitToon v47_GUIr0 で 3枚目が追加されました)。
| スロット | 役割 | 読む共有マスクのチャンネル |
|---|---|---|
| 1枚目 | 全面に出る下地(マスクなしの層が入ります) | — |
| 2枚目 | 領域を絞って乗せる層 | R |
| 3枚目 | 同上(2枚目とは別の領域) | G |
- MatCap 1枚+マスクあり → MatCap の実体を2枚目スロットへ置き、マスク(白=適用)をそのまま領域マスクに割り当てて再現します(1枚目スロットは無効化)。
- MatCap 2枚・両方にマスクあり → 両方とも再現します。1枚目のマスクを共有マスクの
R、2枚目のマスクをGへ詰めた画像を自動生成し、それぞれ 2枚目・3枚目スロットへ割り当てます(v5_GUIr0 まではマスクが 1 枚しか持てず、1枚目のマスクは反映できませんでした)。 - MatCap 2枚・2枚目だけマスクあり → 1枚目を下地(全面)、2枚目をマスク領域へ割り当てます。
- MatCap 2枚・マスクなし(重ね掛け) → 排他選択のため再現できません。片方を全域適用にし、レポートで通知します。
メインカラー2nd / 3rd の UV Mode が MatCap のとき
lilToon のメインカラー2nd / 3rd は UV Mode に MatCap(ビュー座標に投影)を選べます。この設定は実質「3枚目・4枚目のマトキャップ」として使われるため、Texture Layer ではなく Matcap スロットへ変換します(通常 UV の Texture Layer へ流すと、投影方式が失われて絵が別物になってしまうため)。
- 強度は色のアルファ、合成モードは MatCap と同じ規則で 乗算 / 加算 に寄せます。
- 回転角・UV スクロールは反映しません(ビュー座標投影では意味を持たないため)。レポートで通知します。
- UV Mode が
MatCap以外のときは従来どおりです(2nd は Texture Layer へ、3rd は未対応の警告)。
スロットは合計 3 つまでです。変換元が 4 層以上(MatCap + MatCap 2nd + メインカラー2nd + 3rd をすべて MatCap として使用)のときは、MatCap → MatCap 2nd → メインカラー2nd → メインカラー3rd の優先順で 3 つまで割り当て、あふれた層はレポートで通知します。
2枚目と3枚目を同時に使うときは、1 枚の画像の R と G に別々の領域を塗り分けてください(グレースケール画像は R=G=B のためどちらのスロットも同じ領域を指し、3枚目が 2枚目を覆います)。本ツールが自動生成する場合は正しく詰め分けられます。中間調(半透明のグラデーション)を多用したマスクは、変換後に Inspector のチャンネルプレビューで確認のうえ微調整してください。
リムライト・リムシェードの変換
- リムライトのテクスチャ:変換元のリム色テクスチャは既定が白で乗算で効くため、黒く塗った領域にはリムが出ません(=実質マスク)。本ツールはその明るさを Rim マスクへ変換し、「リムが出る場所」を再現します。色の変化までは再現できません(Rim Color は単色のため)。
- リムシェード(縁を暗くする):ARLitToon v48_GUIr0 以降では専用の Rim Shade へ変換します(色・太さ・濃さ・マスクをそれぞれ専用の項目へ)。Rim Shade は Rim Light とは独立したレイヤーなので、リムライトとリムシェードが両方有効でも、両方そのまま再現できます。式が異なるため濃さは近似なので、強すぎる・弱すぎる場合は Rim Shade Intensity で調整してください。
- ARLitToon が v47_GUIr0 以前の場合(Rim Shade が無い版):従来どおり Rim Light の Blend Mode = Multiply で近似し、両方有効なときはリムライト(光らせる側)を優先して、リムシェードはレポートで通知します。
共有マスクのチャンネル割り当て
共有マスク 1 枚を最大 4 機能が読みます。本ツールが自動生成する場合の割り当ては次のとおりです。
| チャンネル | 用途 |
|---|---|
R | 2枚目 Matcap の領域 |
G | 3枚目 Matcap の領域 |
A | Rim Light のマスク |
| (下記) | Rim Shade のマスク |
Rim Shade のマスクの置き場所:
- リムライトのマスクが無いときは
A(ARLitToon の既定と同じ・Rim Light と共用する枠)。 - リムライトのマスクもあるときは、空いているチャンネルを
G→R→Bの順に使います(リムライトのマスクとは別の画像なのでAを共用できないため)。Bは最後の手段です。Bは Fake Shadow Texture の既定チャンネルで、Fake Shadow の焼きこみ(Bake)はBを上書きするため、Bに入れたときはレポートで警告します。そのマテリアルに影を焼きこむ場合は、先にリムシェードのマスクを別のチャンネルへ移してください。
- 「マスクテクスチャを焼き込んだ合成テクスチャを生成する」が ON(既定)のときは、マスクが 1 枚だけでも上表のチャンネルへ詰めた共有マスクを生成します=各機能が ARLitToon の既定チャンネルを読みます(例:Rim Light のマスクだけなら
A)。使わないチャンネルは黒(=その機能を効かせない)になるため、後から別の機能を ON にしても、意図しない絵を読むことはありません。 - 各チャンネルの中身は、機能ごとの個別画像としても保存します(
Textures/SharedMask_<マテリアル名>/にMatcap2.png・Matcap3.png・RimLight.png・RimShade.pngと、それをまとめたSharedMask_<マテリアル名>.png)。1 つの機能のマスクだけを描き直したいときは、その個別画像を編集して共有マスクへまとめ直せます(どの画像がどのチャンネルに入ったかはレポートに出ます)。 - このオプションが OFF のときは画像を生成できないため、変換元のマスク画像をそのまま割り当て、読むチャンネルは
Rになります(変換元のマスクはアルファが全面 1 のことが多く、Aを読むと全面白=全面に効いてしまうため)。マスクが 2 枚以上あるときは 1 枚目だけを設定し、レポートで通知します。 - 複数の機能が同じマスク画像を使っている場合は、詰め直しても領域が分かれないためレポートで通知します。
アルファマスクの透過率調整について
lilToon のアルファマスクは「透過率(Scale/Value)」で見え方を調整できますが、ARLitToon の透明マスクには同等の調整項目がありません。本ツールは、この調整を反映した調整済みのマスク画像を自動生成して持ち込みます(元の透け具合を再現)。変換後にさらに微調整したい場合は、マテリアル全体の透過率(Color のアルファ)や Alpha Cutoff で調整するか、調整値を変えてから再変換してください。
半透明と落ち影(Dither Fade)について
半透明(Fade 相当)に変換したマテリアルは、Unity の仕様で落ち影(Receive Shadow)を受けられません。前髪の透けなどで「半透明にしつつ落ち影も受けたい」場合は、変換後マテリアルの Blend Preset を Cutout にして Dither Fade(ディザ擬似半透明) を ON にする方法があります(変換レポートでも該当マテリアルに案内が出ます。自動では切り替えません)。
リムライトの鋭さとラメについて
- リムの強さ・太さ:色だけを引き継ぎ、
Rim Powerは1・Rim Intensityは0.1に設定します。変換元と ARLitToon ではリムの算出式も環境光の扱いも違うため、数値を換算して持ち込むとリムが強く出すぎるためです。まず控えめな状態から始めて、必要なら上げてください。元の設定に寄せたい場合の目安の数値はレポートに出ます(鋭さは効き方が逆向き=変換元は値が大きいほど細く鋭い/ARLitToon は値が大きいほど太いため、換算した値を載せています)。「ライティングを適用」の設定は Rim Env Adapt(環境順応)へ引き継ぎます。 - ラメ(Glitter):有効化と色・強度は移しますが、粒の生成方式が異なるため、粒の大きさ・密度・形状・点滅速度は引き継がずシェーダー既定のままにします。Glitter Sparkle 節の Grain Scale / Coverage / Size / Shape / Flicker Speed で見た目を合わせてください(レポートにも案内が出ます)。
- ラメの「色 / マスク」テクスチャ:テクスチャの明るさ × アルファを Emission Map のアルファへ焼き込み、Glitter の マスクに使うチャンネル = アルファ (A) に設定します(ARLitToon v48_GUIr0 以降・焼き込み ON のとき)。発光の色(RGB)は元の Emission Map のままです(Emission Map が無い場合は RGB を白にするので、発光の見た目は変わりません)。ARLitToon はこのアルファをメインテクスチャと同じ UV で読むため、発光のスクロールや Tiling があってもマスクの位置はずれません。色付きのテクスチャの「色の違い」は再現できません(ARLitToon のラメは単色のため、明るさだけを移し、レポートで通知します)。UV0 以外の UV を使っている場合と、焼き込みが OFF の場合は反映せず、ラメは全面に出ます(レポートで通知)。
- 発光のマスク:Emission Map のアルファへ焼き込み、Emission の Emission Map のアルファでマスク を ON にします(ARLitToon v48_GUIr0 以降・焼き込み ON のとき)。アルファはメインテクスチャと同じ UV で読まれるため、発光がスクロールしていても、マスクの位置は変換元と一致します(以前は発光の色へ掛け合わせていたため、発光がスクロールするとマスクも一緒に流れていました)。
- 発光のマスクとラメのマスクの両方がある場合:Emission Map のアルファは 1 つしかないため、次のように割り当てます。
- 同じ画像(同じ Tiling/Offset)なら、アルファを共用します(Emission・Glitter のマスクとも ON)。
- 別の画像なら、アルファはラメのマスクに使い、発光のマスクは従来どおり発光の色(RGB)へ掛け合わせます。発光がスクロールする・発光とマスクの Tiling/Offset が違う場合は、マスクの位置がずれることがあるためレポートで警告します。
- 発光テクスチャ自身のアルファ/発光色のアルファ:変換元はどちらも発光の強さに掛けます(透明な部分は光らない)。ARLitToon の発光は色(RGB)しか使わないため、発光テクスチャのアルファは発光の色(RGB)へ掛け合わせ(アルファが実際に 1 未満の部分を持つときだけ・焼き込み ON のとき)、発光色のアルファは Intensity へ掛け合わせます。発光テクスチャの色とアルファは同じ絵なので、発光がスクロールしても位置は一致します。
- 書き出す画像:組み立てた発光テクスチャと、チャンネルごとの中身を
Textures/EmissionMap_<マテリアル名>/にまとめて置きます(EmissionMap_<マテリアル名>.png=マテリアルに割り当てる本体/Emission_RGB.png=発光の色/Emission_A.png=アルファの中身を灰色で表したもの)。
MatCap の合成モードについて
変換元の合成モードは次のように対応づけます。ARLitToon の MatCap は 乗算 / 加算 の 2 種類です。
| 変換元 | 変換後 |
|---|---|
| 乗算 | 乗算 |
| 加算 | 加算 |
| スクリーン | 加算(近似) |
| 通常(置き換え) | 乗算(近似) |
通常(置き換え)はどちらとも違うため近似になります。乗算を選んでいるのは、通常合成の MatCap は白〜明るい画であることが多く、加算にすると素材が白く発光してしまうためです。乗算なら明るい MatCap はほぼ素通しに倒れるので、明るくなりすぎる事故が起きません。艶を強く出したい場合は、変換後に合成モードを 加算 へ変えて強度を調整してください(レポートにも案内が出ます)。
変換せずスキップするマテリアル
次の専用シェーダーのマテリアルは ARLitToon に対応する設定がなく、近似変換もできないため変換しません。元のマテリアルのままスロットに残すので、これらの部分はこれまでどおり機能します(変換レポートにスキップした旨と理由が出ます)。
- ファー / 毛(Fur・FurCutout・FurTwoPass):毛を多層で生やすための専用設定。変換すると毛が消えて土台だけが残ります。
落ち影専用(FakeShadow)マテリアルの変換について
落ち影専用シェーダーのマテリアルは、ARLitToon の Fake Shadow Mesh(v44 以降)へ変換します(v1_GUIr0 まではスキップ対象でした)。変換方式は 2 つから選べます(ウィンドウの落ち影マテリアルの変換)。既定は B(ベースマテリアルへ統合する)です——影用スロットが 1 つ減り、マテリアル数とパス数を抑えられるためです。同じレンダラーにベースマテリアルが無い場合は自動的に A 相当へ倒れるので、統合を選んでも変換できなくなることはありません。
# A. 影用メッシュをそのまま変換する
影用スロットを「影だけを描く ARLitToon マテリアル」に変換します。変換元で作り込まれた影の形・位置をそのまま使うため、見た目の再現性が高い方式です。
- 影用のメッシュはそのまま残して使います。
- 変換後のマテリアルは Fake Shadow Mesh が ON、base pass は不可視(半透明+アルファ 0)に設定されます。ARLitToon の Fake Shadow Mesh は影を描く専用パスが独立しているため、通常の描画だけを消して影のパスだけを残すことができます(影の板が不透明な板として出ることはありません)。
- Render Queue は 3001(受け手より後に描く必要があるため)を設定します。受け手側がこれより後に描かれる設定になっている場合は影が出ないため、受け手側の Render Queue を下げてください。
- 押し出し距離(FS Mesh Distance)は、影用メッシュがすでに受け手の手前に置かれていることを前提に小さめの値(0.2)を設定します。
# B. ベースマテリアルへ統合する(影用スロットを削除・既定)
同じレンダラーのベースマテリアル(髪本体など)へ Fake Shadow Mesh を移植し、影用のマテリアルスロットを削除します。マテリアル 1 枚とパス 1 つぶん軽くなります。
- 影の形が変わります:本体メッシュ自身を押し出して影にするため、変換元の影用メッシュの形とは異なります。
- 統合先の Render Queue を +1 します:Fake Shadow Mesh は受け手より後に描かれることが動作条件のため(受け手と同じ値だと影が出ません)。受け手(顔など)の Render Queue が統合先と同じかそれ以上の場合は影が出ないので、受け手側の値を下げてください。調整前後の値はレポートに出ます。
- ベースマテリアルが同じレンダラーに無い場合は、自動的に A へフォールバックして影用マテリアルを書き出します(どちらで処理したかはレポートに出ます)。
- スロット削除の安全策:Unity はマテリアル配列の N 番目をサブメッシュ N に割り当てるため、途中のスロットを削除すると以降のメッシュとマテリアルの対応がずれます。そのため実際に削除するのは末尾から連続している分だけで、中間に残るスロットは完全不可視のマテリアルに置き換えます(描画されないので見た目は削除した場合と同じです)。どちらの処理をしたかはレポートに出ます。
# 両方式に共通
- 影の色・濃さは変換元の色から引き継ぎます(色の RGB → 影色、アルファ → 濃さ)。
- 変換元と異なり、どちらの方式でも影は光源の向きと頭の動きに追従します。光源が届かない場所では Fake Shadow Mesh 節の FS Fallback Dir(既定は斜め上方向)に沿って影が出ます。
自動変換できない主な機能(レポートで通知)
3rd テクスチャ(UV Mode が MatCap 以外)/ デカール配置 / テクスチャ回転 / 影色テクスチャ / AO マップ / グラデーションマップ / 2nd ノーマルマップ / ラメの粒形状・密度 / 2nd 発光 / AudioLink(方式が異なるため手動設定)/ 屈折 / テッセレーション など。
変換後は必ず実機(またはシーン上)で見た目を確認し、必要に応じて ARLitToon の Inspector(マテリアルの各セクション)で微調整してください。
Prefab が作られないとき
変換レポートの [全体] Prefab 保存: の行に理由が出ます。 よくある原因は次のとおりです。
- 参照の切れたスクリプト(Missing Script)がアバターに含まれている。Unity は Missing Script を持つオブジェクトを Prefab として保存できません。レポートにどの GameObject に何件あるかまで出るので、不足しているスクリプト(VRChat SDK や外部アセット)をインポートするか、該当コンポーネントを削除してから再変換してください。
- 保存先フォルダを作成できなかった/保存時に例外が出た。レポートに内容が出ます。
いずれの場合も、シーン上の変換済みアバターはそのまま使えます(マテリアルの変換は完了しています)。Prefab が要らなければ「変換後のアバターを Prefab として保存する」を OFF にしてください。
反映されていないように見えるとき
まず変換レポートの「変換後マテリアルを保存: …」のパスと、Inspector で開いているマテリアルのパスが同じか確認してください。 変換は実行するたびに別のフォルダ(〇〇/ → 2回目は 〇〇_2/ …)へ出力するため、以前の変換で作られた古いマテリアルや、シーンに残っている古い複製アバター(〇〇_ARLitToon)を見ていると、最新の変換結果は反映されていません。不要になった古いフォルダと複製アバターを削除してから確認すると確実です。
レポートには有効化したトグルと設定値(例: _UseBackLight=1 / Intensity=1)も出力されるので、値まで含めて突き合わせられます。「対応機能がないため反映していません(v39 以降で対応)」と出ている場合は、Unity 側の ARLitToon シェーダーが古いので、シェーダーを最新版へ更新してから再変換してください。
重なり順(描画順)がおかしいとき
マテリアルスロット(Element 0 / 1 …)の並びは変換で入れ替わりません。 変換ツールはスロットの番号を保ったまま中身だけを差し替えます(唯一の例外が、落ち影マテリアルの変換で「ベースマテリアルへ統合する」を選んだときのスロット削除です。この場合も、対応がずれない末尾のスロットだけを削除します)。Inspector の下部に並ぶマテリアルのエディタは Materials リストと順番が違って見えることがありますが、これは Unity の表示上の並びで、スロット順ではありません(元のアバターを選択しても同じ並びになります)。
見た目の重なり順が変わってしまう場合は、変換レポートの 描画設定: Render Queue=… / ZWrite=… / Cull=… の行を該当マテリアルどうしで見比べてください。よくある原因は次の2つです。
- 半透明の ZWrite が On:半透明部分も深度を書くため、後ろにあるもの(前髪など)が隠れます。変換元の設定を尊重して継承していますが、崩れる場合は Transparency 節で ZWrite を Off にするか、Blend Preset を Cutout + Dither Fade に切り替えてください(レポートにも注意として出ます)。
- Render Queue:変換元で明示的に指定されていた場合のみ、その値を引き継ぎます。指定が無い場合は ARLitToon のプリセット既定(Opaque=2000 / Cutout=2450 / Transparent=3000 / Fade・Additive=3001)です。顔と髪など前後関係を作り込んでいたアバターでは、Inspector の Render Queue で微調整してください。
元に戻したいとき
- シーンの変更(複製・非アクティブ化・マテリアル割り当て)は Ctrl+Z(Undo) で戻せます。
- 生成されたマテリアル・テクスチャ・レポートは出力フォルダごと削除すれば消えます(元アバター・元マテリアルには影響しません)。
バージョン(更新履歴 / Changelog)
最新版の変更点は下記に、それ以前の履歴は折り畳み内にまとめています。バージョンは小数点を使わない整数で v{変換ロジックの版}_GUIr{GUI 枝番} と表記します(ARLitToon シェーダー本体と同じ方式)。本ツールは converter/Editor/ARLitToonConverter.cs の 1 ファイルで、変換で書き込むプロパティの追加・変更、共有マスクの割り当て変更、変換対象外にするシェーダーの追加など変換結果に影響する変更をしたときは v の数字を上げて GUIr を 0 に戻し、ウィンドウのレイアウト・表示文言など変換結果に影響しない変更のときは GUIr の数字だけを上げます。現在の版はウィンドウ上部・完了ダイアログ・変換レポートの先頭で確認できます。冒頭の「対応シェーダー版」(ARLitToon 側の最終確認バージョン)とは別の番号です。混同しないでください。本履歴には各版の変更点のみを記載します。各項目の変換内容は前述の「主な変換マッピング」を参照してください。
v7_GUIr0 ARLitToon v48_GUIr0(3枚目の Matcap・リムライトのマスク)に対応しました。・メインカラー2nd / 3rd の「UV Mode = MatCap」に対応しました。・MatCap を 2 枚とも使い、両方にマスクがある構成で、1枚目のマスクも反映できるようになりました。・変換元が 4 層以上のマトキャップを使っている場合は、優先順で 3 つまで割り当てるようにしました。・リムライトのテクスチャを Rim マスクへ変換するようにしました。・リムシェード(縁を暗くする)に対応しました。・光沢(反射・スペキュラ)の質感を移植するようにしました。・メインカラー2nd が「マスクだけ」の構成で、マスクが効いていなかった不具合を修正しました。・リムシェードのマスクを共有マスクの B に固定で入れるのをやめました。・マスクが 1 枚だけのときも、共有マスクを生成して ARLitToon の既定チャンネルを読むようにしました。・ラメの「色 / マスク」テクスチャを反映するようにしました。・発光のマスクを Emission Map のアルファへ移すようにしました。・組み立てた発光テクスチャと、そのチャンネルごとの中身(RGB/アルファ)を書き出すようにしました。・発光テクスチャ自身のアルファと、発光色のアルファを反映するようにしました。・シャドウ受光(Receive Shadow)を ON で引き継いだとき、レポートで注意をお知らせするようにしました。・ウィンドウの表示言語を「日本語 / English」で切り替えられるようにしました。
過去の更新履歴を開く(クリックで展開)
- v6_GUIr0 多段の影を引き継ぐようにしました(ARLitToon v47_GUIr0 対応)。2 影・3 影 の色・強度・境界・ボケ足・ノーマルマップの反映度と、境界の色づけを引き継ぎます(これまでは「2影は 1 段に簡略化」という警告を出していました)。いずれも ON/OFF は専用チェックボックスへ写し、不透明度は「濃さの強度」として渡します。落ち影を受ける度合い・影色へのメインカラー乗算・明るい場所での薄め方は書き込みません(ARLitToon 側で固定運用になったため)。影色テクスチャ・AO マップなど画像で指定する項目は引き継げないため、従来どおり警告でお知らせします。
- v5_GUIr0 ARLitToon v46_GUIr0 に対応し、変換後のアバターを Prefab として保存する機能などを追加しました。
- v4_GUIr0 「ベースマテリアルへ統合する」で影が出ない不具合を修正しました。 統合先の Render Queue を受け手より後ろへ(+1)調整するようにしました(Fake Shadow Mesh は受け手より後に描くことが動作条件のため)。修正前は Inspector で Fake Shadow Mesh を OFF→ON すると出る、という症状になっていました。
- v3_GUIr0 落ち影マテリアルの変換方式を選べるようにしました(「影用メッシュをそのまま変換する」/「ベースマテリアルへ統合する」)。統合を選ぶと、同じレンダラーのベースマテリアルへ Fake Shadow Mesh を移植し、影用スロットを削除します。ベースが同居しない場合は自動で従来方式へフォールバックします。
- v2_GUIr2 変換レポートに「スキップしたマテリアル」の専用セクションを追加しました。 マテリアル名・シェーダー名・スキップ理由に加え、アバター内のどこで使われているか(GameObject パスとマテリアルスロット番号)を一覧表示するようにしました。また、すでに ARLitToon になっているマテリアルが件数だけ増えて行に出ず、件数と内訳が合わなかった問題も解消しました。
- v2_GUIr1 出力フォルダの既定がアバター名に追従しない不具合を修正しました(アバター未設定のままウィンドウを開くと
.../Materialsで固定され、後からアバターを入れても変わりませんでした)。あわせて既定のフォルダ名に元 Prefab アセットの名前を使うようにし、「マスクテクスチャを焼き込んだ合成テクスチャを生成する」の既定 ON を EditorPrefs で保持するようにしました。 - v2_GUIr0 落ち影専用シェーダー(FakeShadow)のマテリアルを、スキップせず ARLitToon の Fake Shadow Mesh へ変換するようにしました(影用メッシュはそのまま利用・base pass は不可視化)。
- v1_GUIr0 バージョン管理を導入しました(本節・ウィンドウ表示・レポート表示を新設)。