見出し画像

【VRChat】UnpackPrefabをしてはいけない理由、そしてPrefabを活用することによるその効果。

イントロダクション

皆さん、なんとなくUnpackPrefabしてません?
突然ですが、今まで改変をやってきてこんなことありませんでしたか?

  • アプデ用のUnityPackageをインポートしたらアバターが透明になった

  • 商品ページに「上書き更新しないでください」と書いてあった

  • 最近「Prefab解凍するな」とは聞くけど、なんでなのか分からない

今回はPrefab(プレハブ)について解説します。
日本語だと"プレハブ解凍"とか"プレハブを展開"って呼んでますが、実はあれ解凍でも展開でもないことをしれっとやってます。
この記事を読んで

  • そもそもPrefabとは何か

  • UnpackPrefabとは実際何をしているのか

  • 最近「UnpackPrefabをしてはいけない」といわれる理由は何なのか

  • そもそも、何故今までUnpackPrefabをしていたのか

あたりについて理解してもらいたいと思います。


今回は前書いた.metaに関する記事のような、技術メインの記事です。
あと、滅茶苦茶本腰入れて書いたら長文になったので気を付けてください。
(終わった後に見たら7400文字オーバーありました)

1.そもそもPrefabとは何か

まず、Unity公式のリファレンスを見てみましょう。

Unity の Prefab (プレハブ) システムでは、1 つのゲームオブジェクトをそのすべてのコンポーネント、プロパティ値、子ゲームオブジェクトとまとめて、再利用可能なアセットとして作成、設定、保存することができます。プレハブアセットはテンプレートとして機能し、シーン内で新しいプレハブインスタンスを作成できます。

プレハブ - Unity マニュアル

これだけ見ても「なんのこっちゃ?」って感じですよね。
VRChatにフォーカスした書き方で書いていきましょう。ただし、ちょっと遠回りなところから説明します。

1-1.そもそもアバターは如何にして動いているか

昔作った画像を引っ張ってきました。この画像をもとに説明します。

アバターは基本的に、ボーン(人体でいう骨)とメッシュ(人体でいう肉)が合体したFBXと呼ばれるファイルからできています。このFBXというのは.fbxという拡張子が付いているファイルで、BlenderやMayaなどで作成できます。

ただし、FBXは骨に合わせて肉が動くだけの人形でしかないので、「PhysBoneで髪の毛が揺れる」だとか、「声に合わせてリップシンクが動く」と言った設定まではFBXに内包できません。イメージとしてはデッサン人形のようなものです。

そのため、Unityを用いてPhysBoneの設定やリップシンクの設定、さらには表情の設定等、アバターとして動くための設定をFBXに対して行う必要があります。いわばここはデッサン人形を操り人形に改造する工程です。

これらの設定をして初めて「VRChatのアバター」としてアップロードが出来るようになります。図で纏めるとこんな感じです。

FBXを出力してからが長いです

そして気付いたかもしれませんが、このUnityでアバターとしてセットアップする工程が大変です。AnimatorControllerとかAnimationClipとかいろんなものと殴り合い対話をする必要があります。

そのため、この"FBXをアバターとして使うことが出来るようにしたもの"をパッケージにまとめている物が、皆さんが普段見ているPrefabです。

1-2.アバターのPrefabとFBXを見てみよう

話を戻して、例としてアバターのPrefabを出しましょう。
今は萌ちゃん付属のPrefabをHierarchyに置いたところです。

普段何気なく置いてるアバターのPrefabですが、ここでProject内にあるPrefabを選択してみましょう。
「Pipeline Manager」や「VRC Avatar Descriptor」と言った文字が見えますが、ここではまず「Variant Parent」に着目します。

右上の枠です

Variant Parentをクリックすると、FBX_Moeという名前の段ボールのようなアイコンのファイルがハイライトされます。これが上で説明したFBXです。

1-3.Prefabの親子関係とオーバーライドについて見てみよう

画面を戻して、Prefabをクリックした状態のInspectorに戻しましょう。

Root(ルート)と書いてあるのが始まりとなっているPrefab、Current(現在)と書いてあるのがこのPrefabです。Overrideの部分には242と記載されています。

Inspectorの右上に三本線のようなアイコンがあります。これをクリックするとVariant Family(バリアントファミリー)と呼ばれる親子関係を示した図が出てきます。
これを見ると、「FBX_Moeという名前のFBXに対して、242か所の変更を加えたものがこのMoeというPrefabですよ」ということが分かりますね。

この「変更を加えたよ」という情報をPrefab自体に記録する機能を指してOverride(オーバーライド)と呼びます。

「オーバーライド」という単語は「上書き」を意味する単語ですが、Unityにおいてオーバーライドとは「Prefabに情報を記録する機能」を指します。誤用に注意しましょう。

2.Prefabには3つの種類がある

一言でPrefabと言っても、以下の三種類があります。
それぞれの特徴も合わせて見てみましょう。

2-1.FBX Prefab(FBXプレハブ)

まず初めにFBX Prefabです。

厳密に言うとこれはPrefabではなくFBXなのですが、UnityはFBXをPrefabとして解釈するため、便宜上Prefabの1種類として扱います。
特徴としては

  • FBXなのでBlenderなどUnity以外のツールで読み書き出来ること

  • このPrefab自体にオーバーライドが出来ないこと

  • アイコンが段ボールであること(かわいいですね)

といったことがあげられます。「このPrefab自体にオーバーライド出来ないなら、FBXに何か変更を加えた時はどうするの?」と言った場合、この後説明するPrefabVariantを使います。

2-2.Prefab Variant(プレハブ バリアント)

次にあげるのがPrefab Variantです。
さっきみた萌ちゃんのPrefabはこの形式でしたね。

これはFBX PrefabやPrefab Originからの派生(バリエーション)として作成されたPrefabです。
特徴としては

  • 派生元(親)となるPrefabから変更した項目をオーバーライドすることが出来る

  • オーバーライドしていない項目については親(アバターならFBX)を引き継ぐ

  • アイコンは青い立方体で、左側面がグレーの斜線になっている

と言った違いがあります。
上に書いた通り、FBXを親としたPrefabとなるので、アバターの更新や改変に伴ってFBXが更新されてもアバターが壊れません。

2-3.Prefab Origin(プレハブ オリジン)

最後にPrefab Originです。
例として挙げるのはセレスティアのPrefabです。

これはFBX Prefabなどの親となるオブジェクトが存在しないPrefabです。
このPrefabには以下の特徴があります

  • Prefab Variantと同じく、変更点をオーバーライド出来る

  • FBX Prefabや他のPrefabを元に作成した場合でも親の存在を完全に無視する

  • アイコンが青一色の立方体になっている

「じゃあなぜセレスティアのPrefabはこれになっているの?親となるFBXがあるよね?」といった疑問が生まれると思いますが、Unity2019であれば、FBX PrefabをPrefabにしようとした時に選択肢を間違えるとこの形式になります。

Prefab作成時の選択肢
この選択肢の一番左を選ぶとPrefab Originとなってしまいます

上記に書いた通り、親となるべきFBXを無視したPrefabとなるので、アバターの更新や改変に伴ってFBXが更新されるとアバターが壊れます。
冒頭に書いた

  • 商品ページに「上書き更新しないでください」と書いてある

  • アプデ用のUnityPackageをインポートしたら透明になってしまう

と言った症状はこのPrefab Origin化が原因です。

上に「Unity2019であれば」と書きましたが、Unity2022.3.6f1からはPrefab Variantしか作成できないように選択肢が変更されました。
Unity2022.3.22f1ではそもそも選択肢がなくなり、HierarchyにおいてあるFBXをProject画面にドラッグアンドドロップ(Prefab作成操作)を行うと無条件でPrefab Variantとなるように変更されました。

2024/5/28現在

2.Prefabを展開した時、一体何が起こるか

では、ここまで説明したところでPrefabを解凍してみます。
今回はUnpackCompletely(Prefabを完全に展開)を選択しました。

Prefabを展開すると、すべて真っ白になってしまいました。
今さらですが、この白い四角をUnityでは"ゲームオブジェクト"と呼びます。

燃え尽きたぜ…真っ白にな…

今回は参考に、左側に萌ちゃん付属のPrefab、右側にUnpackPrefabをした萌ちゃんを配置します。
青枠がPrefab、赤枠がゲームオブジェクトです。見辛くはなりますが、ギズモ(PhysBoneやPhysBoneColliderが見えるもの)をONにしておきます。

青がPrefab、赤がUnpackPrefabしたものです

この状態で、Blenderを使って耳のメッシュを削除してみます。

やり方は流石に割愛します

さて、BlenderからUnityに戻って来ましょう。
なんとUnpackPrefabした方のアバターが透明になっています。
Hierarchyに存在していて、PhysBoneもあるのにメッシュだけ見えません。

みんなが改変初心者の頃に見た光景

どれだけ改変したアバターであってもこうなると、PrefabをHierarchyに置くところからやり直すことになります。

因みに実験では省いていますが、Prefab Originでも同様の状態になります。内部処理の都合上、一度Unpack Prefabを挟んでいるためです。

なぜメッシュが見えなくなるのか、それはUnpackPrefab(Prefabを展開)という操作が

"展開ではなく、親とのリンクを切断しているから"

という点が原因です。

2-1.(おさらい)メッシュはボーンに従って動く

上に貼った図をもう一度引っ張って来ましょう。この図にある通り、メッシュはFBXに含まれているボーンに従って動きます。

そしてボーンが集合したものをArmature(アーマチュア)と呼びます。
ここで新しく覚えて欲しいのですが、メッシュは元々紐づけられたArmatureとしか連動しません。詳しく説明したいのですがここの説明だけで記事が書けるボリュームになるのでここでは割愛します。

詳しく知りたい人は
・Blender 頂点グループ
・Blender アーマチュアモディファイア
とかで検索かけてください。

例え話すると、メッシュが園児アーマチュアは幼稚園の先生だと思ってください。たとえ同じ"幼稚園の先生"であっても、メッシュという名前の園児たちは自分の担任の先生(アーマチュア)にしかついて行きません。

※イメージ

2-2.先生もいるならついて行くよ(PrefabVariantの場合)

ヒエラルキーで"Body"のメッシュを選択して、Inspectorから"Mesh"の項目を見ます。そうすると、さっき編集したFBX_Moeの中のメッシュが指示されます。つまりHierarchyのメッシュは常にFBXの中身を参照しているのです。

HierarchyでBody(顔)のメッシュを選択して遡ると、最終的にFBXの中のメッシュに辿り着きます

じゃあ、このFBXのメッシュは何に従って動いているんでしょうか?
当然、FBXの中のArmatureに従って動きます。そして、PrefabVariantの場合、Hierarchyで見えているArmatureは元をたどればFBXのArmatureです。

アーマチュアはアーマチュア、BodyのオブジェクトはBodyとリンクしています

実はHierarchyのArmatureも、FBXが更新されるのに合わせて更新がかかっています。メッシュは元々紐づけられたArmatureとしか連動しないというルールにのっとっているので、メッシュがちゃんと見えるし動くというわけです。

2-3.先生はどこに行ったの?どうすればいいのか分からないよ(UnpackPrefabの場合)

次にUnpackPrefabをした場合です。
ヒエラルキーで"Body"のメッシュを選択して、Inspectorから"Mesh"の項目を見ます。こちらもHierarchyのメッシュはFBXの中身を参照しているのです。

ここはさっきと同じです

では担任の先生であるアーマチュアはどうでしょうか?
上に書いた通り、FBXとのリンクが切断された為、Armatureには更新がかかりません。

アーマチュアに更新がかからずメッシュにだけ更新がかかります

こうなると上に書いたメッシュは元々紐づけられたArmatureとしか連動しないというルールが満たせなくなるため、園児たちメッシュは

  • アーマチュアが見つからないから!

  • Hierarchyに居るのは担任の先生(FBXのアーマチュア)じゃない!

と言って表示されなくなります。これがアバター透明化の原因です。

ModularAvatarを用いたUnpackPrefabをしない改変(非破壊改変)が主流の現在において「UnpackPrefabをするな」と耳に胼胝ができるほど聞くのはこれが理由です。

FBXの中でも頂点情報に更新がかかった時に壊れることが多いです。
「今壊れなかったから大丈夫」と言ったところで「いつか爆発する不発弾を抱えながら改変をする」という状態に変わりはありません。

3.じゃあ今までなんでUnpackPrefabしてたんだ?

見も蓋もないことを言ってしまうと、

着せ替えやるならそれしか方法がなかったから

ただそれだけです。

かつて、オーソドックスな衣装着せ替えの手法としては

  1. まずは衣装をアバター配下に置き

  2. 衣装のボーンをアバターのそれぞれのボーン配下に移動させて

  3. 衣装をアバターと連動して動かすことによって「服を着ているように」見せる

といった方法が一般でした。詳しくはここ読んでください。

この手法には、大きな問題点がありました。

まず、衣装もFBXからできているPrefabですが、Prefabの中の物はPrefabの外に出せません。
これはPrefab自体の性質を考えると何ら不思議ではないですが、これが原因で衣装のボーンをアバターのボーン配下に移動させることが出来ません。

そしてこの手法が生まれました。

  1. まずは衣装をアバター配下に置き

  2. 衣装のPrefabをUnpackPrefab(ボーンを外に出せるように)してから

  3. 衣装のボーンをアバターのそれぞれのボーン配下に移動させて

  4. 衣装をアバターと連動して動かすことによって「服を着ているように」見せる

といった手法が一般的になりました。
かつて使われていたキセテネなどのツールもこの手法をなぞっています。
(3.の工程を自動化しているだけです)

そしてそこにプレイモードの間はPrefab化が解除され、自由に物が動かせるという仕様を利用したModularAvatarが生まれました。これによって「とりあえずUnpackPrefabはマズイ」といった情報が共有され始めました。

4.結局どうすればいいの?

まず第一に、UnpackPrefabは行わないようにしましょう。
これは大原則ですが、手癖でやってしまうこともあるかもしれません。
もしやってしまったらCtrl+Zで元に戻しましょう。Unityを閉じない限りは元に戻せます。

本当にダメなときはこれです

そしてもう一つ、ModularAvatarを活用しましょう。

ModularAvatarはPrefabの中の物でもプレイモードの間だけは自由に動かせることを利用して、衣装を着せたりAnimatorの合成をしてくれるツールです。前回の海苔を消す記事でも紹介しました。

ModularAvatarはプレイモードの間だけ、あるいはアップロードしたアバターにしか結果を反映させないため、UnpackPrefabをしない非破壊改変が可能です。他にも非破壊改変が可能なツールとしては

  • AAO: Avatar Optimizer

  • FaceEmo

  • TexTransTool

などがあります。

これらを活用して、特別な理由がない限り非破壊的な改変をしましょう。
(いつアバターのアップデートが来てもいいようにね)

5.まとめ

以上、説明はここまで。
ここまで読んだ後なら、冒頭のこの疑問にも答えられるんじゃないかな?

  • そもそもPrefabとは何か

  • UnpackPrefabとは実際何をしているのか

  • 最近「UnpackPrefabをしてはいけない」といわれる理由は何なのか

  • そもそも、何故今までUnpackPrefabをしていたのか

今回のまとめです。

  • VRChatにおいてPrefabとは、FBX(モデルデータ)にショップ側がアレコレ調整したものをパッケージングしたものである

  • PrefabにはFBX Prefab、Prefab Origin、Prefab Variantが存在する

  • UnpackPrefabしたりPrefab Originにした物は元となるFBXとのリンクが切断されるため、FBXに更新が入った場合に壊れる

  • UnpackPrefabをしなくても、ModularAvatarを使えば衣装を着せられる

滅茶苦茶長文になったので、今回はここで終わりです。

PS.今回のタイトルの元ネタが気になる人は「お米タル」で検索してください。

この記事が気に入ったらサポートをしてみませんか?