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

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

# 環境
Unity 2019.4.29f1

# プレハブ（Prefab）って何？
Unity公式に説明を譲ります（丸投げとも言う）。

https://docs.unity3d.com/ja/2018.4/Manual/Prefabs.html

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

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

# プレハブ化で何が楽になるのか？
別にアバターに限った話ではありませんが、今回はアバターの改変で話を進めます。

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

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

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

# 改変後で共通する部分を素体としてプレハブ化
ということでやっていきましょう。
プレハブ化は、Hierarchy から Project タブへドラッグ＆ドロップすることで簡単にできます。
![プレハブ化前.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843472/55773460-8444-a32e-f727-2629351b9d06.png)
![プレハブ化後.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843472/82682dd8-4c33-a649-6ca9-896484d2cfaa.png)
プレハブ化すると、シーン上のオブジェクトはインスタンスに変わります。
新たにインスタンスを作成する場合は、プレハブをシーン上にドラッグ＆ドロップするだけです（VRChatter には馴染み深いと思います）。

さて、改変をどんどん進めていき、こんなインスタンスが出来上がりました。
![改変中.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843472/0015cd85-3143-ef98-8284-0c12ca95b472.png)
かなり色々変えましたが、元のプレハブはどうなっているでしょうか。
![プレハブ内.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843472/453f4683-cedf-36ff-7417-2643aea01fa2.png)
元のプレハブには、インスタンス側での変更は反映されていません。
![改変中２.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843472/ba48518b-c561-57a4-f93b-f4903b5501ef.png)
他のインスタンスにも反映されていません。

では逆に、プレハブの内容を変更してみます。
プレハブの編集画面へは、プレハブ右の「＞」から入れます。
![ズーム.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843472/f387ebaf-9550-81ca-7d01-c32dd61170b0.png)
編集画面がこちら。
![プレハブ編集１.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843472/93ffdc17-702a-b913-7cdd-23fe153ad01b.png)
試しに、Action Layer に Animator を設定してみます。
![プレハブ編集２.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843472/cae75e28-22bb-b314-3865-d90feb82eb3e.png)
画像左上（Wolferia_Base の左）にある「＜」から元の画面に戻ります。
これでプレハブの内容を変更したわけですが、インスタンス側ではどうなっているでしょうか。
![キャプチャ10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843472/2d8e96f4-7147-6146-25fc-22e2a3b7503a.png)
インスタンス側の Action Layer にも 同じ Animator が設定されました。
既にあるインスタンスは全て反映されますし、これから新たに作る場合も変更済みで作成されるので、だいぶ便利じゃないでしょうか。

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

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

それでは。

#参考

https://qiita.com/riekure/items/48b24e84cc8850621176

https://qiita.com/miikun109/items/cb8a0c01f7f2a460737d

[^1]: インスタンスで変更した内容をプレハブに反映する方法もありますが、今回は割愛します。
[^2]: 後述の通り、インスタンス側で変更済みの項目・UnPack Prefab されている場合については反映されません。
[^3]: インスタンスの状態をプレハブに合わせることによって、結果的に反映させることはできますが、今回はそこまで考えません。
[^4]: Inspector 上で Enable のチェックボックスを外し、Tag を Editor Only にすることで、事実上の削除は可能です。