ルートに変更された Prefab があるかどうかを調べるエディター拡張

Prefab の Apply や Revert をし忘れていないかいつも心配になるので、それをチェックするエディター拡張を作成しました。

自分のワークフローだとルートに存在している Prefab だけをチェックするようにしたほうが都合が良かったのでそうしていますが、子孫含めたすべての Prefab をチェックしたい場合は、rootGameObjects = ...の部分を適宜書き換えてください。

using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEditor.Experimental.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;

public static class GcTools
{
    [MenuItem("GcTools/Check if Root Prefabs have Changed")]
    public static void CheckIfRootPrefabsHaveChanged()
    {
        IEnumerable<GameObject> rootGameObjects;

        var currentPrefabStage = PrefabStageUtility.GetCurrentPrefabStage();

        if (currentPrefabStage == null)
        {
            // Prefab Mode でない場合、シーンのルートにある GameObject を取得
            rootGameObjects = SceneManager.GetActiveScene().GetRootGameObjects();
        }
        else
        {
            // Prefab Mode の場合、ルートの Prefab の 1 階層下にある GameObject を取得 
            rootGameObjects = currentPrefabStage.prefabContentsRoot.transform.Cast<Transform>()
                .Select(child => child.gameObject);
        }

        // 変更されている Prefab Instance を抽出
        var overriddenPrefabInstances = rootGameObjects
            .Where(PrefabUtility.IsAnyPrefabInstanceRoot)
            .Where(x => PrefabUtility.HasPrefabInstanceAnyOverrides(x, false))
            .Select(x => (Object)x)
            .ToArray();

        foreach (var instance in overriddenPrefabInstances)
        {
            Debug.Log($"ルートの Prefab が変更されています:{instance}");
        }

        if (!overriddenPrefabInstances.Any())
        {
            Debug.Log("ルートに変更された Prefab はありませんでした。");
        }

        // 変更されている Prefab Instance が存在していたら、それらを選択
        Selection.objects = overriddenPrefabInstances;
    }
}

The coloring of this site is Dracula PRO🧛🏻‍♂️
This website uses the FontAwesome icons licensed under CC BY 4.0.

2020 GIGA CREATION