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; } }