今回はModelの更新に関するTipsです。
モデルの差し替えのトラブル
ゲーム開発を進める時、最初からモデルはFix済みの物を使う訳ではありません。例えばボーン構造が変化したり、メッシュの中身が変化するといった事は良くある事です。
この時、Animator以下のオブジェクトにコンポーネントをセットしていなければAnimator以下のオブジェクトを差し替えるだけで済みます。
メッシュの頂点やUV変更等であれば、ファイルの上書きで更新するならばオブジェクトの差し替えも要らないかもしれません。
逆に、Animator以下のオブジェクトにコンポーネントをセットしている場合…例えばRagDollをセットしているような状況だと、面倒なことになるかもしれません。
単純にMeshの差し替えでは上手く動作しなかったり、旧Prefabと新Prefabを比較して何が接続されているのかを確認したり。
オブジェクト構造やコンポーネントを維持しつつモデルを差し替え
モデル調整の度にコンポーネント構造を再セットするのは面倒なので、コンポーネントの情報を維持しつつモデルを差し替えるアプローチです。
これはOtimize Transform Hierarchyがコンポーネントがアタッチされているオブジェクトを破棄せず、かつDeoptimize Transofrm Hierarchyで巻き戻した際にAvater情報を元に再構築する…という流れを利用しています。
大雑把な流れとしては、
- オリジナルのPrefabでOptimize Transform Hierarchyを実行
- PrefabにセットされているSkinedMeshRendererを削除
- 移植したいモデルをシーンに配置し、Optimize Transform Hierarchy
- 新しいモデルのSkinedMeshRendererをオリジナルPrefabに移植
- オリジナルPrefabのAvaterを、新しいモデルの物に変更
- オリジナルPrefabでDeoptimize Transform Hierarchyを実行
といった流れです。
実際の流れ
最初はこの状態からスタートです。
AnimatorをOptimize Transform HierarchyでHierarchy構造をスッキリさせます。これでボーン構造が実際のGameObjectに左右されなくなります。
この時、コンポーネントがセットされているオブジェクトは非表示にならず残ります。
次に、オブジェクト以下のMeshRendererやSkinedMeshRendererを削除します。
これは、単純にMeshがMissingになってしまったり、旧モデルを維持しつつ新モデルをセットしたい場合の手順です。
探すのが面倒ならば、Hierarchyの検索機能でRenderer系だけ探して消します。
移植したいモデルもシーンに配置し、Optimize Transform Hierarchyを実行します。その後、移植したいモデルのRenderer系を全てPrefab以下に移動します。
後はPrefabのAvaterを更新し、Deoptimize Transform Hierarchyを実行します。
Avaterの情報を元にTransformの構造を直すっぽいので、この順番を間違えると正常に動作しないかもしれません。
これで完了です。
全体の作業Gifはこんな感じです。
コンポーネントの参照先は残らない問題
このアプローチでは、コンポーネントの参照先は消えてしまうかもしれません。Optimize Transform Hierarhyはコンポーネントが付いている物は残しますが、他のコンポーネントが参照しているものまでは判定していないみたいです。
参照先にコンポーネントがあれば問題無いですが、Transformのみのコンポーネントを参照している場合は注意が必要です。
この辺りでも、コンポーネントが直接参照するよりコンポーネントが自己登録しに行くアプローチの方が安定するかもしれません。直接参照の方が早くはあるんですけどね…