
Unity 絶対に失敗しないFBX更新を目指しPrefabの理解を進める
映像制作をしていて、作業と平行しつつ、都度必要なメッシュなどを追加したりしていた。ただ、あるタイミングでこの追加メッシュが適応されなくなった。
色々調べてると、中途半端なPrefab理解のせいで一日潰しちゃったので自戒も含めて書いておく。
参考記事。非常にわかりやすく、重要なことがコンパクトに書かれてる。読み込んでおいて損はない。
そもそもPrefabってなにさ
スクリプトやマテリアルなど、様々なスクリプトを追加して数値を弄ったりしたオブジェクトを使い回せるようにする仕組み。そのプロジェクト内の複数のシーンに使ったりするなど、Unityを扱う上で頻繁に使う概念だと思うのでしっかりと理解しておきたい。
最新のPrefabについての知識をつけておく
Prefabの概念自体はunityに昔からあったみたいで、古い情報などが普通に混ざってきている。新たに学習する際はその記事がいつ書かれたものなのかも確認しておくとよい。
どんな失敗をしたのか
端的に言えばfbxのPrefab化がいつの間にか解けててメッシュ更新が適応されなくなった。Prefabは使い回すための仕組みで、UnityではfbxファイルもPrefabとして扱う。fbxファイルのPrefabが解けるということは、fbxファイルを更新したときに大変なことになる。

わかりやすくするためにキューブを追加したfbxを読み込んだ。Prefabがきちんと動作していれば、このキューブが自動で追加されるはず。本来なら、このモデルが読み込まれる全ての場所でこのキューブが一斉に表示されるのが、Prefabの良いところなのだ。

でも実際は追加されない。
手動でメッシュを追加することも試したが、このfbxがアニメーションした際に追加メッシュが動いてくれなかったり、色々な問題が出てきたため、調べたらPrefabへの理解がそもそも足りなかったという結論にいきついた。

きちんとしたPrefab構造。「Pllana_unity_output」がテープで梱包されたダンボールみたいなアイコンになってる。これがfbxのPrefab。参照元のfbxが更新されたらこいつも自動で変更される。

問題の構造。梱包が解かれてるみたいなアイコンになってる。こうなると、文字通り梱包が解かれており、fbxとのリンクが途切れているような状況なので、fbxの変更が適応されない場合が出てくる。小規模な変更なら問題無いが、メッシュ追加などには対応できない。
失敗しないPrefabの作り方

シーンにゲームオブジェクトをrootとして作り、その下にfbxを追加する。
このままでは、まだこのシーンだけのユニークなオブジェクト。使い回せない。そこでこのrootゲームオブジェクトをプロジェクトウインドウに放り込む。普通にドラッグアンドドロップする。

これでPrefab化が完了した。青い箱の表示になったらPrefab化が完了している。
これで基本的にfbxが更新されたら、prefab_rootのfbxも更新される。
Prefabの更新
ゲームオブジェクトを追加したり、スクリプトを更新したりする場合、特定の手順が必要になる。

新たにゲームオブジェクトをPrefabに追加した。+アイコンが表示されており、これは、Prefabに追加された未更新オブジェクトがあることを知らせている。まだPrefab全体に適応されておらず、今このシーンに存在しているこのPrefab単体にしか存在していない。

試しに、プロジェクトウインドウ内にあるPrefab本体をダブルクリックしてPrefab編集画面に入ると、追加されたオブジェクトが表示されていないことが確認できる。Prefab全てにこの変更を適応する場合、オーバーライドする必要がある。

他の同じprefabを参照するオブジェクトにはこの追加オブジェクトが存在していないことが確認できる。
失敗例
ここで私は失敗していて、Prefabを更新するために、プロジェクトウインドウ内のPrefab本体を消して、改めてシーンヒエラルキーからPrefabを追加していた。

ぱっと見、更新できているような気がする。

しかし、fbxのアイコンを見ると、梱包されたアイコンでなくなっているのが確認できる。fbxのPrefab化が解けている。失敗である。今後fbxに大きな変更が行われた際に、変更が適応されない時が出てくる。聖なる糞!
適当な知識は失敗の元だというのがよくわかる。
正しい方法

Prefabのインスペクターに「Overrides」という項目がある。ここでPrefabを更新することができる。

Apply Allで更新される。

アイコンが消えた。これで全てのPrefabで変更が適応された。fbxの梱包アイコンもそのままだ!やったぜ

他の同Prefabオブジェクトを見ても、更新が適応されていることが確認できる。これがPrefabの強みだ。
fbx内へのゲームオブジェクト追加も問題無く行える。
物理演算とかの関係で、fbx内のボーン構造の中にゲームオブジェクトを追加することがままある。これも上記の方法で問題無く更新できる。

fbx内のボーン構造にゲームオブジェクトを追加した。オーバライドしてみる。


問題無く実行でき、fbxのアイコンそのまま。

ただ、Prefab編集画面に入ると、追加アイコンが表示されたまま。

試しにfbxをオーバーライドしてみようとするが、オーバーライドできないと言われる。
これは当たり前の話で、fbxもPrefabとしては扱われてるが、この変更はあくまでroot Prefabが持っている情報なので、fbxファイルに書き込む必要は無い。というか書き込めちゃうと次回fbxが更新された時に情報が全部吹っ飛ぶだろうし。まぁ、親のPrefabが持ってるから気にしないでオッケー☆ くらいで良いと思う。
これで安全にfbxが扱えるようになったと思う。