【Unity】【エディタ拡張】スクリプトからPrefabを操作する(Unity2018.2まで版)

スクリプトからPrefabを操作する方法です。
Unity2018.3からはPrefab workflowが大きく変わったのでこのあたりもいろいろと変わってると思うのですが、
とりあえず2018.2までの情報です。

Unity2018.2

Unity2018.3以降はこちら(2019/1/21追記)

Unity2018.3以降はPrefab周りのAPIが大きく変わったので下記の記事を参照してください。

light11.hatenadiary.com

空のPrefabを作成する

名前空間は下記すべてUnityEditorです

// 空のPrefabを作成
// 既にあったら新しいPrefabとして作成(既存のPrefabのリンクは切れる)
PrefabUtility.CreateEmptyPrefab("Assets/[Path to prefab].prefab");

GameObjectからPrefabを作成してGameObjectと紐づける

// GameObjectからPrefabを作成してGameObjectと紐づける
// 既にあったら新しいPrefabとして作成(既存のPrefabのリンクは切れる)
var prefab      = PrefabUtility.CreatePrefab("Assets/[Path to prefab].prefab", someGameObject);
PrefabUtility.ConnectGameObjectToPrefab(someGameObject, prefab);

PrefabとGameObjectとの紐づけを解除する

// PrefabとGameObjectとの紐づけを解除する
PrefabUtility.DisconnectPrefabInstance(someGameObject);

インスタンスから、インスタンス化する前のPrefabの中の一致するGameObjectを返す

// インスタンス化する前のPrefabの中の一致するGameObjectを返す
PrefabUtility.GetPrefabParent(someGameObject);

このオブジェクトが所属するPrefabのルートオブジェクトを返す

// このオブジェクトが所属するPrefabのルートオブジェクトを返す
// Prefabのインスタンスを与えた場合はPrefabのインスタンスのルートオブジェクトを返す
PrefabUtility.FindPrefabRoot(someGameObject);

「Apply」と同等の処理を行う

// 「Apply」と同等の処理を行う
var someGameObjectRoot  = PrefabUtility.FindPrefabRoot(someGameObject);
var parentPrefabRoot    = PrefabUtility.GetPrefabParent(someGameObjectRoot);
PrefabUtility.ReplacePrefab(someGameObjectRoot, parentPrefabRoot, ReplacePrefabOptions.ConnectToPrefab);