Unity Prefabの接続と解除

開発ツールの作成中、
HierarchyにPrefab実体を生成した上で取り扱うことが時々あるのですが、
今回はPrefabの接続を切りたいケースが出てきたので、
調査をしてみました。

UnityのEditorスクリプト上でPrefabを生成するには
var instance = PrefabUtility.InstantiatePrefab(prefab);
で、マウスのドラッグでPrefabをドロップしたときと同じ生成ができます。

普段ツールではこの生成方法を使用しているのですが、
今回は途中でPrefabのApplyを抑制したいタイミングがでました。
そのために、生成したオブジェクトのPrefab的な接続を解除する必要があります。

生成で使ったPrefabUtilityにはDisconnectPrefabInstance()というメソッドがあります。
こちらを呼び出すと、Prefabとしての接続が切れ、
たとえばProject上にある元Prefabを編集してもシーン上のオブジェクトへ反映されなくなります。
(GetPrefabTypeしたところ [DisconnectedPrefabInstance] が得られます)
が、やりたいことは「Applyさせたくない」であり、
元Prefabがどれだったのかという情報さえも喪失させなければなりません。

というわけで、Editorスクリプト上ではあまり使わない
GameObject.Instantiate() を使ってやることで、
接続のないPrefabオブジェクトを生成して解決させることに至りました。
var tmp = instance;
instance = GameObject.Instantiate(tmp);
GameObject.DestroyImmediate(tmp);
とすることで、接続状態のPrefabから非接続のPrefabオブジェクトに
変わったように見せかけられます。

再接続するときはPrefabUtility.ConnectGameObjectToPrefab()を使います。

解除、再接続のどちらにしても別物になっているらしく、
ツールで使用している、他の参照(コンポーネントなど)は再度取得しなければならない点は
気をつけなければいけません。