Prefab EvolutionのReadMeの和訳

# Prefab Evolution
Unityのアセット、Prefab evolutionのrerad meを適当に和訳

プレハブをネスト・継承できるようにするためには、シーンでそのプレハブを選んで「Allow this to be nested」を押すだけです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/0d602c08-e5ba-3e67-facb-6f6e6db10556.png)

これでこのプレハブはほかのプレハブにネストできます。ヒエラルキーウィンドウの緑のキューブのアイコンは、インスペクターウィンドウにある「Apply」ボタンをクリックしたときに、このプレハブに適用された全ての変更がこのプレハブにネストされた全てのインスタンスに伝播することを表します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/96359c97-0630-e388-f85b-14c5d3b9036c.png)

ヒエラルキーの緑のキューブ、またはインスペクターウィンドウのMenuボタンを押すことでメニューを表示できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/6aac7d2d-32ce-5cb8-a451-4e21c18a1a65.png)

現在のプレハブから継承するプラハブを作るには「Create Child」を押してください。このプレハブはプロジェクトに「\_Child」と付いて現れ、シーンにもインスタンスが生成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/4a678798-8fa6-065a-718a-cb12846b5032.png)

「Child」プレハブはネストプレハブのようなもので、親プレハブに適用されたすべての変更を受け継ぎます。「Child」プレハブには親の名前のボタンが付いていて、クリックすると親のプレハブがプロジェクトウィンドウでハイライトされます。
それでは、「New Prefab」という新しいゲームオブジェクトを置いてインスペクターまたはプレハブメニューにある「Apply」ボタンをクリックしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/ae16b095-274a-92e8-12b9-bdd059fb93e4.png)

ノーマルプレハブを作って、「New Plafab_Clild」をその中に置き、「Apply」ボタンをクリックしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/b5b8280b-ad05-9616-7069-9801285bbc09.png)

黄色のキューブはネストプレハブであることを表していて、このインスタンスに適用された変更は「New Prefab_Child」のほかのインスタンスに影響を及ぼさず、上書きされます。ネストされたインスタンスや子のプレハブは自由に変更できます。例えば、ゲームオブジェクトやコンポーネントを作ったり削除したり、またはどんなオブジェクトを内包するプレハブでもTransformを変更できます。「New Prefab_Child」インスタンスの中に新たに「Proxy」ゲームオブジェクトを子として置いてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/4a0cda0f-2ed9-36e9-e155-854f36071768.png)

次に、「New Prefab」内の「GameObject」をの名前を「Child」に変更して、「New Prefab」の変更を適用してください。「Gameobject」の全てのインスタンスの名前が「Child」に変わります。このように、「Proxy」ゲームオブジェクトは今でも「New Prefab_Child」のインスタンス内の中にあり、「Child」は今でも「Proxy」ゲームオブジェクトの子です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/47b49310-a046-38a0-a875-dedd37edadf6.png)

次に、新しいゲームオブジェクトを「New Prefab_Child」の「Child」ゲームオブジェクトに置いて、「New Prafab_Child」にApplyしてください。このゲームオブジェクトは「New Prefab_Child」にネストされたインスタンスにも表れます。しかし「New Prefab」には表れないことがわかります。これは、「New Prefab_Child」は「New Prefab」を継承しており、親オブジェクトの変更は適用されないからです。また、ネストされたプレハブのインスタンスはそのインスタンスのプレハブに変更を適用することはできません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/b64960e4-7c00-b86c-9d62-c84599fe109a.png)

「Compund Prefab」の中に「New Prefab」のインスタンスを置いて、「Compund Prefab」にApplyしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/c00ff6d3-75f4-f912-8651-6ee39113c15c.png)

次に、「New Prefab_Child」プレハブの「Child」ゲームオブジェクトの名前を「The Child」に変更して、「New Prefab_Child」プレハブに変更を適用してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/b34d2a85-32da-6697-affb-dba4660248a8.png)

するとインスペクターウィンドウで「New Prefab_Child」プレハブの子オブジェクトのnameプロパティが変更済みとしてマークされていることが確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/44afa48c-8265-fe9c-7581-d607a04fe44b.png)

次に、「New Prefab」プレハブの「Child」ゲームオブジェクトの名前を「A Child」に変更して「New Prefab」プレハブにApplyしてください。「New Prefab_Child」上のインスタンスではなく「Compund Prefab」内の「New Prefab」のネストされたインスタンスのみに変更が適用されていることがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/8d3afeda-9d23-c8ae-2bc6-917c456ae52d.png)

Default、Keep、Ignoreの3つのプロパティ上書きモードがあります。Defaultモードは親プレハブでこのプロパティを同じ値に変更したら上書きされたプロパティがプレハブの値にリセットされます。例えば、「New Prefab」の「A Child」ゲームオブジェクトの名前を「The Child」に変更すると「New Prefab_Child」はこのプロパティを将来的に書き換えず、もし親プレハブがそれを変更したらこのプロパティに変更を適用します。「A Prefab」の名前を「The Prefab」に変更して，「New Prefab」にApplyしましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/63d2448b-07c2-d6af-531b-0c7eaacb4efc.png)

そして名前を「Child」に変更して「New Prefab」にApplyしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/16f8fd79-489c-b80d-7a94-368f61f1f4ae.png)

「New Prefab_Child」は名前プロパティの書き換えられず名前も変更されません。Keepモードはプロパティの上書きが必ず適用されます。しかし、親プレハブの変更を適用するとIgnoreモードのプロパティは必ず親プレハブから継承します。
プレハブメニューからプレハブがどのプレハブに依存しているかを確認することができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/55b64e03-c920-287d-5589-6ea065d4ebd9.png)

ネストされたプレハブのインスタンスは、その親プレハブが変更されたときに変更が伝播しないように無効化することができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/c34a02c6-968f-f053-08b3-a340327003e1.png)　![image.png](https://qiita-image-store.s3.amazonaws.com/0/69889/c5e04b11-f2a7-1fae-b83d-dd5bf6bae688.png)

**インポートされたモデル**
インポートされたモデルはネストされたプレハブと同じ振る舞いをします。これにより、他のプレハブにネストさせたり継承させることができます。全てのインスタンスを再インポートした後，モデルはアップデートされます。これにはひとつ制限があります。モデルの全てのボーンが異なる名前でなければなりません。これは、ヒエラルキーの変更を判断する唯一の方法であるからです。
また、この特性を無効化することもできます。（Unity → Preferences → Prefab Evolution）

**ソースコードバージョンへの移行**
同梱のソースコードなしでこのプラグインを使っていた場合、プレハブEvolve Prefabスクリプトを使っているプレハブを全て変換する必要があります。Unity Editorの Unity → Preferences → Prefab Evolution を開きMigrateをクリックします。この操作でdllからインポートされたEvolvePrefabスクリプトからEvolvePrefab.csのスクリプトへのすべての参照を置き換えます。