はじめに
どうも。「バーチャルためにならない改変お姉さん」の水無月せきなです。
アバターの改変とそのバリエーション作成をしていたら、「そう言えば、プレハブ化したら部分的に楽ができるんじゃないか」と思った話です。
環境
Unity 2019.4.29f1
プレハブ(Prefab)って何?
Unity公式に説明を譲ります(丸投げとも言う)。
ざっくり言えば、シーンに配置するオブジェクトの設計図、でしょうか。
このプレハブをドラッグ&ドロップしてシーン上に配置されたオブジェクトのことは、そのプレハブの「インスタンス」と呼ぶようです。
プレハブをぽいぽいと置いていけば、中身がそっくり同じなインスタンスを望むだけ作れます。
また、インスタンスそれぞれで変更された内容は、元となったプレハブには反映されません。1
逆に、プレハブの内容を変更した場合は、派生したインスタンスすべてに反映されます。2
プレハブ化で何が楽になるのか?
別にアバターに限った話ではありませんが、今回はアバターの改変で話を進めます。
あるアバターの髪型や髪色を変え、アクセサリーを追加し、改変したとしましょう。
次に、新たに衣装の違うバリエーションを別で作る必要に迫られました。
先に作成したバージョンを複製して、衣装を変えることで作成します。
これで別バージョンも出来てめでたし……と思いきや、アバターの髪型を変えたくなってしまいました。
アバターの髪型を統一して変えようとすると、最初に作成したアバターと、次に作成したアバターの両方を修正しないといけません。
今回の例では作成したバリエーションが2つなので、そう大した手間ではありませんが、修正箇所が多数に及ぶ場合やバリエーションがより多い場合には、大変な手間となってしまいます。
というか、バリエーションを1つずつ1から作るのも面倒です。
……先ほど、プレハブという機能の存在を紹介しました。1つ1つ別に作っていくのではなく、どのバリエーションでも共通する部分(たとえば髪・顔・体など)をまず作ってプレハブ化します。そしてそのインスタンスを作れば、後はバリエーションの部分を作るだけです。修正も、共通部分であればプレハブ側で変更するだけで全てのインスタンスを修正することができます。プレハブを利用することで、だいぶ手間を省けるのではないでしょうか?
改変後で共通する部分を素体としてプレハブ化
ということでやっていきましょう。
プレハブ化は、Hierarchy から Project タブへドラッグ&ドロップすることで簡単にできます。
プレハブ化すると、シーン上のオブジェクトはインスタンスに変わります。
新たにインスタンスを作成する場合は、プレハブをシーン上にドラッグ&ドロップするだけです(VRChatter には馴染み深いと思います)。
さて、改変をどんどん進めていき、こんなインスタンスが出来上がりました。
かなり色々変えましたが、元のプレハブはどうなっているでしょうか。
元のプレハブには、インスタンス側での変更は反映されていません。
他のインスタンスにも反映されていません。
では逆に、プレハブの内容を変更してみます。
プレハブの編集画面へは、プレハブ右の「>」から入れます。
編集画面がこちら。
試しに、Action Layer に Animator を設定してみます。
画像左上(Wolferia_Base の左)にある「<」から元の画面に戻ります。
これでプレハブの内容を変更したわけですが、インスタンス側ではどうなっているでしょうか。
インスタンス側の Action Layer にも 同じ Animator が設定されました。
既にあるインスタンスは全て反映されますし、これから新たに作る場合も変更済みで作成されるので、だいぶ便利じゃないでしょうか。
注意点
既にインスタンス側で変更がされている内容については反映されません。
たとえば、体のシェイプキーをプレハブの値から変更しているインスタンスには、プレハブでそのシェイプキーの値が変更されても反映されません。3
プレハブとの関連が絶たれているため、プレハブがアンパッケージ( UnPack Prefab )されている場合も反映されません。
また、プレハブ内のオブジェクトの削除はできない4などの制約があったりします。
おわりに
既にご存知の方も多いかなと思いながら書きました。また、SDK3 の導入によって1つのアバターに多数の衣装を詰め込んで着替えることが容易になったため、バリエーションを別個のアバターとして作成する機会は減ったかと思います。
ただ、他に応用が利くかもしれませんので、とりあえず勉強成果ということで。
それでは。
参考