見出し画像

GameObjectとPrefabをざっくり理解する

なんだか最近(2023年5月)VRChatterの中でPrefabが話題ですね。というわけでいい機会なのでPrefabとは何かを説明してみます。ちゃんとUnityを勉強したわけではないので、おそらく各所に突っ込みどころがあると思います。気づいた有識者の方は教えてください。

ちなみに、Unityのスクショがちょくちょく登場しますがmacOS環境なのでメッセージボックスのデザインなどWindowsと違う部分があります。ご了承ください。


GameObject

まず、前提情報としてゲームオブジェクトの説明をします。Prefabとか以前に Unityを触る上でまず全員が最初に知っておくべき概念です。Hierarchy を見るとキューブ型のアイコンがたくさん並んでますね。これ、全部GameObjectです。

Hierarchyに並ぶGameObjects

Unityではシーン上に置いてるものは全部ゲームオブジェクトです。ゲームオブジェクトとは、箱です。ただの箱なので、単体では特に意味はありません。ヒエラルキーで右クリック→Create Emptyとすると空のゲームオブジェクトを作れます。

Create Empty
作成した空のGameObject

でもメッシュとかボーンとかいろいろ種類あるじゃん?て話ですが、Unityではそれらをコンポーネントで表現します。たとえば、いわゆるメッシュの場合はSkinned Mesh Rendererというコンポーネントが付いています。インスペクタータブで確認できるやつですね。例として、画像にあるこのコンポーネントの中身を見ると、Meshという欄に格子のアイコンがあり、Body2と書いてあります。押してみると、fbxファイルの中のメッシュがハイライトされました。このメッシュデータを参照してるってことですね。

Skinned Mesh

マテリアルもやはりアセット内のデータを参照しています。
つまり、Unityでメッシュと呼ばれているものは、ゲームオブジェクトにSkinned Mesh Rendererをつけたものだとわかります。(ここではアバターを想定しているのでSkinnded Mesh Rendererですが、変形しないメッシュの場合はMesh Rendererとなります。)

ここまでの話を聞くと、空のゲームオブジェクトに自分でコンポーネントを付けて設定したら同じメッシュのオブジェクトを作れるのでは?なんて考えが浮かびますが、その通りです。空のオブジェクトにSkinned Mesh Rendererをつけ、おんなじ設定をすれば同じメッシュができます。
ここで大事なのは、Unityではあらゆるものがゲームオブジェクトという箱にコンポーネントという中身を入れることでできているということです。

fbx

Prefabの前にもうちょっと説明させてください。Unity上でダンボール箱アイコンのやつです。

fbx(上)とPrefab(下)

Blenderなどから出力したモデルデータがこれです。モデルデータなのでマテリアルやらテクスチャの情報は入れられますが、Unityに依存するコンポーネントの情報は入れられません。
余談ですが、参照しているテクスチャデータのパスが内部に保管されるらしいです。本名を使ったユーザーフォルダ下とかに作成すると本名バレするってことですね。気をつけましょう。

シーンに置くと、ボーンとメッシュが階層構造を維持したゲームオブジェクトになります。

Prefab

やっとここまできました。Prefabを一言で言うと、ゲームオブジェクトをまとめたもの、でしょうか。ゲームオブジェクトが箱なら、中身の入った様々な箱を並べてバッキングしたもの、みたいな感じです。パーツを組み合わせた既製品と言ってもいいかもしれません。Unity上では、青いアイコンで表示されてるやつです。Prefabの中身も青い名前で表示されます。

Hierarchy上のPrefab

パッケージ化されているので、同じものを沢山置いたり別のシーンに置いたりできます。それならコピーでいいのでは?と思うかもしれませんが、Prefabのいいところはアセットフォルダ内のオリジナルを"参照"しているということです。シーンに置いた後で、ちょっと形を変えたいなぁとか、マテリアル変えたいなぁとか、コンポーネントを追加したいなぁとか、ありますよね。Prefabならアセットフォルダ内のオリジナルを書き換えたら全てのシーン上のPrefabに変更が反映されます

Prefabの参照

アバターなら、同じ素体に様々な服を着せて個別のアバターとしてアップロードする時、たくさんあるアバターの素体は全部共通ですよね?もしPrefabを使わないと、素体側を変更したら、アバターの数だけ手作業で修正しないといけません。素体側をPrefabの形で利用すれば、後から簡単に共通部分を更新できます。

fbxもPrefab

fbxもよくみるとアイコン青い色してますよね。これも、実はPrefabです。なのでunpackしなければ、シーンに置いたfbxにphysbonesやらマテリアルやらのセットアップをした後で、fbxを上書きで更新することができます!fbxを触る人ならこの恩恵の大きさが分かるはずです。一旦 Unityでセットアップした後でメッシュ形状を修正したり、シェイプキーを追加したり…
Blenderから出力するたびにUnityでのセットアップをやり直す必要はありません。(厳密に"全て"の修正が出来るかはちょっと分かりません。有識者の方教えてください)

作成とVariant

Prefabの作り方は簡単で、ゲームオブジェクトをアセットフォルダの好きなところにドラッグ&ドロップするだけです。この時、元々Prefabなもの(fbxなど)をドラッグ&ドロップすると、Original Prefabを作るか Variantにするか聞かれます。Prefab Variantとは、Prefabを参照する派生Prefabです。Original Prefabというのは、元の Prefabを一度 unpackして詰め直すようなものです。つまり、Original Prefab にすると元のPrefabとは関係なくなってしまうので、元のPrefabの変更を反映したいなら、Variantを使用します。Variantなら、元のPrefabの中身を変えても自動で反映される上に、元のPrefabにオブジェクトを追加したり、一部変更を加えたりできます。

Create Prefab

便利ポイント: 差分が見れる

これ、場所がわかりづらいんですけどInspectorの右上にOverridesってのがあって、元のPrefabからの変更点が全部一覧できます。

Overrides

また、変更された箇所は太字になるのですぐ分かります。太字部分を右クリック、あるいは各コンポーネント右上の点々をクリックすると個別の変更を元に戻したり元のprefabに適用したりできます。

太字で表示された変更点

また、Prefabの構造の中にゲームオブジェクトを追加すると、画像のように+マークのアイコンで表示されます。色も青くないですね。これはオリジナルのPrefabには含まれない、追加されたオブジェクトであることを示しています。

Prefabにゲームオブジェクトを追加する

ところで、Prefabにゲームオブジェクトを追加しようとして怒られたことはないですか?こういうやつです。

Prefab構造のエラー

これをみてunpackしないとだめなんだー、ってなった人も割といると思うんですが、さっきもやったようにPrefabにゲームオブジェクトを追加することは出来ます。じゃあ何で怒られてるのかというと、Prefab内のオブジェクトの順番は変えられないという仕様のせいです。つまり、同じ階層の中間には追加できません。同じ階層の1番後ろなら追加できます。さっきの画像でいうと、hips下のspineとupper_leg.Lの間とかには追加できません。HipColliderの後ろなら追加できます。分かりづらいですねー。

便利な使い方の例

Variantとしてアバターセットアップ

Prefab Variant は差分をつくるのに便利な機能ですが、有効な使い方としてfbxをベースにVariantを作るという使い方があります。こうすると、アバターとしてセットアップしたPrefab Variantは元のfbxへのリンクを維持しています。つまり、さっきのfbx更新し放題が使えるわけです。多くの場合、販売されているアバターデータは新規のprefabとしてセットアップされているので、元のfbxを上書き編集しても適切に反映されず、場合によってはメッシュがぐちゃぐちゃに爆発したりします。これはそういうもの、ではなく Variantを使っていれば大抵はうまく反映されるはずです。多分大体ほとんど全ての場合において、fbxは unpackしないほうが良い結果が得られると思います。参考ツイート:

セーブとして使う

新規にPrefabを作ると、一旦セーブみたいな形で使えます。
今の作業状況をPrefabとして保存しておくと、いつでも取り出せます。

unpackについて

Prefabをunpackする、というのは、Prefabを壊してパッキングを解くという意味です。壊してしまえば、オリジナルへの参照は無くなります。日本語 Unity環境だと、「解凍」と表現されてたりするらしいのですが、いわゆるZipファイルの解凍とは意味が異なることが分かるでしょうか?unpackしたものは、ただのゲームオブジェクトなので、シーン上に自分でゲームオブジェクトを作ってコンポーネントを付けたのと同じです。オリジナルの変更は当然反映されず、変更箇所をチェックすることも出来なくなります。ここまでの説明にあったPrefabの便利ポイントは全て失われてしまい、元には戻せません。気をつけましょう。
ちなみに、このunpackをしようとする時、Unpack Prefabと Unpack Prefab Completelyの2種類ありますよね。これは何が違うかというと、VariantやNested Prefabような入れ子のprefabを親まで全部たどって unpackするかどうかの違いです。例としては、アバターfbxをベースにphysbonesなどをセットアップした variantを作ったとします。でも後からやっぱり一部の追加したオブジェクトを消したり順番を変えたりしたい時、1段階だけ unpackする(fbxはunpackしない!)ことで作り直すことができます。unpack completelyすると、元のfbxまでたどって unpackしてしまうので、fbxの更新も反映されなくなります。

Unpack Prefab

まとめ

ざっくり説明してきましたが、どうでしょうか。Prefabのいいところは、「共通パーツ」を作れて更新しやすいところです。使いこなすことで、Unity作業が楽になるはずです。それでは〜

VRChat関連の技術的な情報などを書いています。「スキ❤️」や「フォロー」していただくとモチベになります。「サポート」していただいたら私が美味しいものを食べます。