Добавлен , опубликован
Практическая применимость
Сегодня я оказался с новым проектом на руках, ну и естественно нужно было вникать в код, который написан был до меня.
В таких случаях могут и возникают ситуации, при которых не понятно, где используется скрипт, который ты сейчас читаешь. Примерно в такой же ситуации оказался сегодня я, когда обнаружил скрипт, абсолютно не связанный с остальным кодом. Вопрос был таков - а в каких сценах он вообще используется?
Юнити в стандарте может сказать вам, где в открытой сцене используется объект. Но когда сцен переваливает за 100 становится проблематично ориентироваться - логично, что открывать каждую сцену и проверять - не вариант.
Этот небольшой скриптик поможет вам в таких ситуациях.
Для того, чтобы сцены находились исправно в Edit/Project Settings/Editor параметр Asset Serialization Mode должен быть выставлен как Force Text. После этого все сцены должны быть пересохранены в этом формате вручную. В принципе, если вы используете контроль версий, то вам так или иначе придется использовать этот режим.
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

/// <summary>
/// Проверяет, использовался ли выбранный файл в какой-либо сцене и если да, то в какой
/// Добавляется в контекстное меню файлов в папке проекта
/// </summary>
public static class SystemObjectFindUsables
{
    [MenuItem("Assets/Где используется?")]
    public static void CheckUsables()
    {
        var path = AssetDatabase.GetAssetPath(Selection.activeObject);
        if (string.IsNullOrEmpty(path))
        {
            Debug.LogWarning("Выберите файл из проекта для проверки на использование");
            return;
        }

        var guid = AssetDatabase.AssetPathToGUID(path);
        var references = GetReferencesScenes(guid);
        Debug.Log("[" + Path.GetFileName(path) + "] Связанные сцены: " + references.Count + "\n" + string.Join("\n", references.ToArray()));  
    }

    private static List<string> GetReferencesScenes(string guid)
    {
        var paths = AssetDatabase.GetAllAssetPaths();
        var result = new List<string>();
        foreach (var path in paths)
        {
            if (!path.EndsWith(".unity"))
                continue;

            var sceneAsText = File.ReadAllText(path);
            if (sceneAsText.Contains(guid))
                result.Add(path);
        }
        return result;
    }
}