Unity Nested Prefabを使ってみる

# 新しいPrefabのワークフロー
Unity 2018.3がリリースされました
このリリースの目玉機能であるNested Prefabを使ってみます
https://unity.com/prefabs

# Nested Prefabとは？
これまでのPrefabは、Prefabの子に別のPrefabを保存することはできませんでした。
Prefabの子に別のPrefabを入れてしまうと、子のPrefabを更新してもその情報が統合されたPrefabの方には反映されないという仕様でした。
![無題のプレゼンテーション (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/105021/53306533-315f-c8d8-4da9-0199881710fc.jpeg)
これを解決するために親のPrefabから子のPrefabをInstantiateしたり、Asset Storeにある[Nested Prefab](https://assetstore.unity.com/packages/tools/integration/nested-prefab-2962)などのアセットを使っていたのではないでしょうか。

これからはUnityが提供してくれたNested Prefabによって、Prefabの中に別のPrefabを保存しておいて取り回しのしやすい運用が行えます。
![無題のプレゼンテーション (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/105021/6b1af036-63ca-00f6-31c8-0eccf59b065f.jpeg)

# 使ってみる
Unity2018.3からPrefab周りのUIが変わっているので、そのことも織り交ぜながら説明していきます。

まずPrefabAとPrefabBを作成します。
わかりやすくするため、PrefabAの子にCubeを、PrefabBの子にSphereを作成しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/1a33e182-4719-1eee-123e-a672581a15ce.png)
2018.3からはPrefabのRootのGameObjectのみ青くなり、それ以外は白いアイコンで表示されるようになったようです。

## Prefabの新しい編集画面
次にPrefabAにPrefabBを子づけします。
2018.3よりPrefabを編集する場合は専用の画面が表示されるようになりました。
（これまではNew Sceneを作成してからPrefabをD&Dしてを編集していた人が多いのではないでしょうか。。。）

Hierarchy上のPrefabを編集するには、右の「>」を
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/de8d600c-b7f9-6c09-15e7-c2f34b370fd7.png)
Project内のPrefabを編集する場合は、OpenPrefabを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/efc3c2c3-a781-e4a7-8888-3edb0a3993c3.png)

するとScene ViewとHierarchyにはそのPrefabだけ表示されるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/688da6b5-6400-2e18-7fa7-ddaf9c294481.png)

PrefabAにPrefabBをドラッグ&ドロップして子づけします。
わかりやすくするためPrefabBの位置を少しずらしておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/e0244b35-290c-da4e-bb94-8d2b5f6f6ab8.png)

元の画面に戻るには左上の「<」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/adffb94c-ed92-965f-5838-a79673ca3957.png)

## Prefabを保存する
Prefabを作っていざApplyしようとしてもボタンがありません。
ここは2018.3からUIが変わっています。
まずOverridesを選択してから「Apply All」を選択するとPrefabが保存されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/3065335e-acaf-c83f-f698-f552b66696ef.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/88f7baf3-e9fd-3408-1df9-35b823ab9e1e.png)

現状はこのような見た目になっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/e9bb9d13-97fe-c790-9aef-48417bc9d2c7.png)

## 個別のPrefabを更新する
さて本題です。子づけしたPrefabBを更新した場合どうなるでしょう。

PrefabBに子づけしてあったSphereをCylinderに変更します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/c2824e81-b1a4-e646-5bc0-9f31b2ef22c6.png)

この状態でPrefabAを見てみると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/399c1ee6-358a-12ae-7a16-916b3de080b8.png)
なんとPrefabBの更新情報が適用されています！

このようにNested Prefabを使えばPrefabを部分ごとに作っておいて、随時更新するという作業がやりやすくなります。

# Tips
## シーン保存
Prefabを特定のシーンでは別の状態で保存したい場合もあると思います
その場合、どのパラメータを編集したかがこれまでよりわかりやすくなりました。
オブジェクトを追加した場合「＋」が表示される
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/2644c05e-9f25-4697-4960-bc34f78dc94d.png)

Inspector上のパラメータを編集した場合、編集した部分が太字になり
左側に青いラインが表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/f3c4f219-1dc0-a741-5d9d-5f4f9bea8a19.png)

## Unpack Prefab
シーン上でPrefab内のオブジェクトを削除しようとすると以下の表示が出ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/6dc11cfc-188f-60b5-8396-01b5044f7739.png)

```
Cannot restructure Prefab instance
Children of a Prefab instance cannot be deleted or moved, 
and components cannot be reordered.

You can open the Prefab in Prefab Mode to restructure the Prefab Asset itself, 
or unpack the Prefab instance to remove its Prefab connection.
```

シーン上でオブジェクトを削除する場合、Prefab自体を変更するかunpackしてリンクを切れと言ってきます。
unpackとは従来のbreak prefab instanceに当たる操作になります。

Prefabを右クリックしてメニューを出すと２種類
「Unpack Prefab」
「Unpack Prefab Completely」
があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/a4ddd792-7e0c-9403-9ecc-45aed11079f3.png)

挙動がどのように違うのかというと

<b>初期状態</b>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/488735e1-7ea2-d6c9-41d0-4945a560aaad.png)

<b>Unpack Prefab</b>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/f02c375b-99ae-8759-5da7-11eec9751c98.png)
自分自身のリンクは切り、NestedしていたPrefabのリンクは生きています。

<b>Unpack Prefab Completely</b>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/7d573d6c-721b-98c8-c7b6-804afde55b69.png)
こちらは完全にリンクを切ってしまいます。
こちらはシーン上で自由に編集ができるようになります。


# まとめ
誰もがずっと待ち望んでいたNested Prefabですが
Prefabそのもののワークフローが変わり、開発がとてもスムーズになりそうな予感がします。