概要

この記事は モバイルファクトリー Advent Calendar 2017 4日目の記事です。

3日目の記事は @carimaticsさんの 「Perlで静的型付プログラミング」 でした。

本記事ではUnityでGameObjectとPrefabとの関連付けを完全に絶つ方法を紹介します。

環境

Unity 2017.2.0f3

Break Prefab Instance

Unityを知っている方ならすぐに「Break Prefab Instance」を思い浮かべるかと思いますが、「Break Prefab Instance」を実行してもInspectorに表示されている「Prefab」の表示が消えずに残ってしまっています。(再度「Break Prefab Instance」が実行できない所を見ると、関連付けは解除されているようですが、なぜInspectorに情報が残るのかが謎です)

1.gif

Inspectorの情報を消すにはPrefab側を消すしかなさそうだったので、何とかPrefabは消さずにInspectorもすっきりさせる方法はないかと探していました。

方法

Prefabを消すことなく関連付けのみを消すには以下のような操作が必要なようです。

2.gif

  1. 新しく別のPrefabを作成
  2. 「Break Prefab Instance」実行
  3. 新しく作った方のPrefabを削除

面倒なのでScript化

using UnityEditor;

public class DisconnectPrefabInstance
{
    [MenuItem("GameObject/Disconnect Prefab Instance", true)]
    static bool IsEnabled()
    {
        return Selection.gameObjects.Length > 0;
    }

    [MenuItem("GameObject/Disconnect Prefab Instance", false, 100)]
    static void Disconnect()
    {
        var outputPath = "Assets/tmp.prefab";

        foreach (var gameObject in Selection.gameObjects)
        {
            PrefabUtility.CreatePrefab(outputPath, gameObject, ReplacePrefabOptions.ConnectToPrefab);
            PrefabUtility.DisconnectPrefabInstance(gameObject);
            AssetDatabase.DeleteAsset(outputPath);
        }
    }
}

上記Scriptを導入することで、簡単にPrefabとGameObjectの関連付けを解除することができるようになりました。

3.gif

まとめ

短いですが、今回は地味に良く遭遇する問題に対しての解消法を紹介しました。
少しでもお役に立てたなら幸いです。

次の担当は @yashims85 さんです。よろしくお願いします。