フリーランスの暇な時に書く技術メモ
Genki Tech

Unityでコンポーネント調整後にモデルだけ一瞬で差し替える方法。

Unity で外部モデル(例えば blender から glTF 形式で出力したもの)を取り込むと、Prefab 形式でインポートされます。その Prefab に剛体やらジョイントでリグを仕込んでいくことはよくあると思います。

image-20210104223720078

そのあとで元になっているモデルを更新したいケースもよくあります。例えばこんな感じ(Blender 画面)

image-20210104224259059

普通に再インポートすると Unity で設定したリグなどは再度作り直す必要があるため、なんとか元のモデルだけうまく差し替える方法がないか探してみました。

スクリプトでコンポーネントを全コピーする方法なども見つかりましたが複雑そうだったので、Unity の標準機能にある、Prefab Variant(プレハブ・バリアント) の機能を使用します。

全てのインポートでうまく行くかは分かりませんが、glTF のインポートではうまく行きました。

差し替え可能なプレハブを作成

この方法で差し替えをするためには、あらかじめ差し替えできる状態でプレハブを作成しておく必要があります。

  1. glTF のインポートで元になるを作成。
  2. 作成した Prefab を ヒエラルキーのビューにドラッグ&ドロップして実態をシーンに作成。
  3. 作成した実態を逆に Project のビューにドラッグ&ドロップして、「Prefab Variant」を作成。
  4. 作成した「Prefab Variant」の方を編集し、剛体やジョイントなどのコンポーネントを追加。

特に 3 と 4 のところが重要で、他の部分は通常通りで OK です。

元データの差し替え

元データの差し替えは、Variant じゃない方の、元になっている Prefab に対して行います。

手順は簡単で glTF を再インポートするだけですが、ドラッグドロップでインポートすると新たに Prefab が作成されてしまうため、メニューからインポートし、インポート先の Prefab ファイルとして、ベースとなっている方の Prefab を指定して上書きします。(間違えて Variant の方を指定すると台無しです)

するとこのようなモデルが。。。

image-20210104230053153

剛体やジョイント設定を残したままモデルチェンジできます。

image-20210104230228132

何が起きてるの?

本来 Prefab Variant は、微妙な違い(バリエーション)のあるプレハブを生成するときに差分情報だけ記述し、元のプレハブを更新するとバリエーション側にも更新が入る便利な機能です。

それをモデルから自動生成されるプレハブと、自分で追加するコンポーネントに分離して管理してるだけです。(プログラミングで言うクラスの派生の様な感じです)

ただ、存在していたオブジェクトが更新されて無くなった場合とかはどうなるんでしょうか。要検証ですね。