3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

アバターの衣装バリエーション作成にPrefabを使う(VRChat)

Last updated at Posted at 2021-09-11

はじめに

どうも。「バーチャルためにならない改変お姉さん」の水無月せきなです。
アバターの改変とそのバリエーション作成をしていたら、「そう言えば、プレハブ化したら部分的に楽ができるんじゃないか」と思った話です。

環境

Unity 2019.4.29f1

プレハブ(Prefab)って何?

Unity公式に説明を譲ります(丸投げとも言う)。

ざっくり言えば、シーンに配置するオブジェクトの設計図、でしょうか。
このプレハブをドラッグ&ドロップしてシーン上に配置されたオブジェクトのことは、そのプレハブの「インスタンス」と呼ぶようです。
プレハブをぽいぽいと置いていけば、中身がそっくり同じなインスタンスを望むだけ作れます。

また、インスタンスそれぞれで変更された内容は、元となったプレハブには反映されません。1
逆に、プレハブの内容を変更した場合は、派生したインスタンスすべてに反映されます。2

プレハブ化で何が楽になるのか?

別にアバターに限った話ではありませんが、今回はアバターの改変で話を進めます。

あるアバターの髪型や髪色を変え、アクセサリーを追加し、改変したとしましょう。
次に、新たに衣装の違うバリエーションを別で作る必要に迫られました。
先に作成したバージョンを複製して、衣装を変えることで作成します。
これで別バージョンも出来てめでたし……と思いきや、アバターの髪型を変えたくなってしまいました。

アバターの髪型を統一して変えようとすると、最初に作成したアバターと、次に作成したアバターの両方を修正しないといけません。
今回の例では作成したバリエーションが2つなので、そう大した手間ではありませんが、修正箇所が多数に及ぶ場合やバリエーションがより多い場合には、大変な手間となってしまいます。
というか、バリエーションを1つずつ1から作るのも面倒です。

……先ほど、プレハブという機能の存在を紹介しました。1つ1つ別に作っていくのではなく、どのバリエーションでも共通する部分(たとえば髪・顔・体など)をまず作ってプレハブ化します。そしてそのインスタンスを作れば、後はバリエーションの部分を作るだけです。修正も、共通部分であればプレハブ側で変更するだけで全てのインスタンスを修正することができます。プレハブを利用することで、だいぶ手間を省けるのではないでしょうか?

改変後で共通する部分を素体としてプレハブ化

ということでやっていきましょう。
プレハブ化は、Hierarchy から Project タブへドラッグ&ドロップすることで簡単にできます。
プレハブ化前.PNG
プレハブ化後.PNG
プレハブ化すると、シーン上のオブジェクトはインスタンスに変わります。
新たにインスタンスを作成する場合は、プレハブをシーン上にドラッグ&ドロップするだけです(VRChatter には馴染み深いと思います)。

さて、改変をどんどん進めていき、こんなインスタンスが出来上がりました。
改変中.PNG
かなり色々変えましたが、元のプレハブはどうなっているでしょうか。
プレハブ内.PNG
元のプレハブには、インスタンス側での変更は反映されていません。
改変中2.PNG
他のインスタンスにも反映されていません。

では逆に、プレハブの内容を変更してみます。
プレハブの編集画面へは、プレハブ右の「>」から入れます。
ズーム.PNG
編集画面がこちら。
プレハブ編集1.PNG
試しに、Action Layer に Animator を設定してみます。
プレハブ編集2.PNG
画像左上(Wolferia_Base の左)にある「<」から元の画面に戻ります。
これでプレハブの内容を変更したわけですが、インスタンス側ではどうなっているでしょうか。
キャプチャ10.PNG
インスタンス側の Action Layer にも 同じ Animator が設定されました。
既にあるインスタンスは全て反映されますし、これから新たに作る場合も変更済みで作成されるので、だいぶ便利じゃないでしょうか。

注意点

既にインスタンス側で変更がされている内容については反映されません
たとえば、体のシェイプキーをプレハブの値から変更しているインスタンスには、プレハブでそのシェイプキーの値が変更されても反映されません。3
プレハブとの関連が絶たれているため、プレハブがアンパッケージ( UnPack Prefab )されている場合も反映されません。
また、プレハブ内のオブジェクトの削除はできない4などの制約があったりします。

おわりに

既にご存知の方も多いかなと思いながら書きました。また、SDK3 の導入によって1つのアバターに多数の衣装を詰め込んで着替えることが容易になったため、バリエーションを別個のアバターとして作成する機会は減ったかと思います。
ただ、他に応用が利くかもしれませんので、とりあえず勉強成果ということで。

それでは。

参考

  1. インスタンスで変更した内容をプレハブに反映する方法もありますが、今回は割愛します。

  2. 後述の通り、インスタンス側で変更済みの項目・UnPack Prefab されている場合については反映されません。

  3. インスタンスの状態をプレハブに合わせることによって、結果的に反映させることはできますが、今回はそこまで考えません。

  4. Inspector 上で Enable のチェックボックスを外し、Tag を Editor Only にすることで、事実上の削除は可能です。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?