【Unity】【エディタ拡張】Prefabモード中にシーンやPrefabの情報を取得する

Prefabモード中にシーンやPrefabの情報を取得する方法です。

Unity2018.3.9

PrefabStage

Unity2018.3からPrefabモードが追加されたのに伴って、PrefabStageという概念が追加されました。

Prefabモード中にこのPrefabStageのインスタンスを取得すると、
編集中のPrefabの情報やシーンの情報などが取れます。

マニュアルは以下にあります。

docs.unity3d.com

docs.unity3d.com

ちなみにこれらはいずれもExperimentalです。
Prefabワークフローが変わったばかりであることを考えると今後変わる可能性も大きそうなので注意が必要です。

色々操作する

それではこのAPIを使っていろんなものを取得・操作してみます。

using UnityEditor;
using UnityEditor.Experimental.SceneManagement;

public class PrefabExample
{
    public void Example()
    {

        // 開かれているPrefabStageを取得する(開かれていなかったらnull)
        var stage = PrefabStageUtility.GetCurrentPrefabStage();

        // PrefabのAssetPath
        var assetPath =  stage.prefabAssetPath;

        // Prefabのルートオブジェクト
        var contentsRoot = stage.prefabContentsRoot;

        // 引数のGameObjectがPrefabの一部かどうか調べる
        var targetGameObj = Selection.activeGameObject;
        stage.IsPartOfPrefabContents(targetGameObj);

        // シーン
        var scene = stage.scene;

        // 変更が加わっているフラグをおろす(保存確認ダイアログが表示されなくなる)
        stage.ClearDirtiness();
    }
}

まだinternalなものが多いようでできることは少ないです。今後に期待。

参考

docs.unity3d.com

docs.unity3d.com

関連

light11.hatenadiary.com