static void LoadAssetDatabase()
 {
     assetLoader    = AssetLoader.GetAssetLoader(true, "AssetBundles/");
     assetsDatabase = AssetDatabase.LoadAssetAtPath <GameAssetsDatabaseScriptableObject>(defaultAssetPath);
     if (assetsDatabase == null)
     {
         Debug.LogError("Нет файла с базой ассетов " + defaultAssetPath);
         return;
     }
     assetsDatabase.Initialize();
 }
        void CreateGameAssetsDatabase()
        {
            string[]         guids      = AssetDatabase.FindAssets("l: " + AssetLabelNames.DatabaseAsset);//, foldersNames);
            List <AssetInfo> assetInfos = new List <AssetInfo>();

            // для кэша путей зарегистрированных ассетов чтобы отличать дочерние ассеты от ассетов с одинаковыми id
            HashSet <string> cachedPathes = new HashSet <string>();

            // для кэша уже зарегистрированных ассетов
            HashSet <string> cachedIds = new HashSet <string>();

            // для кэша уникальных ассетов и проверки что не пытаемся зарегистрировать несколько уникальных ассетов одинакового типа
            HashSet <string> cachedUniqueAssetTypes = new HashSet <string>();

            bool createNewDatabase = (assetsDatabase == null);

            GameAssetsDatabaseScriptableObject gameAssetsDatabase = createNewDatabase ? CreateInstance <GameAssetsDatabaseScriptableObject>() : assetsDatabase;

            for (int i = 0; i < guids.Length; i++)
            {
                string path = AssetDatabase.GUIDToAssetPath(guids[i]);

                if (cachedPathes.Contains(path))
                {
                    // возможно это дочерний ассет. Ассет лейблы вешаются на них автоматически. В базу они попадать не должны
                    continue;
                }
                cachedPathes.Add(path);

                UnityEngine.Object asset   = AssetDatabase.LoadAssetAtPath <UnityEngine.Object>(path);
                string             assetId = asset.name;

                if (cachedIds.Contains(assetId))
                {
                    Debug.LogError("Существует несколько ассетов с названиями " + assetId + " В базу добавлен только один из них. Нужно исправить. Названия ассетов должны быть уникальными");
                    continue;
                }
                cachedIds.Add(assetId);

                string[] assetLabels = AssetDatabase.GetLabels(asset);

                string    assetBundleName = AssetDatabase.GetImplicitAssetBundleName(path);
                AssetInfo assetInfo       = new AssetInfo();
                assetInfo.assetId = assetId;

                if (assetLabels.Contains(AssetLabelNames.Unique))
                {
                    // ассет уникальный и может потребоваться доступ по его типу
                    string assetType = asset.GetType().ToString();
                    assetInfo.type = assetType;
                    if (cachedUniqueAssetTypes.Contains(assetType))
                    {
                        AssetInfo firstRegisteredAsset = assetInfos.Where(a => a.type == assetType).FirstOrDefault();
                        Debug.LogError("Ассеты " + assetId + " и " + firstRegisteredAsset.assetId + " помечены как уникальные ассет лейблом " + AssetLabelNames.Unique + " Ассет " + assetId + " не добавлен в базу");
                        continue;
                    }
                    cachedUniqueAssetTypes.Add(assetType);
                }
                if (!string.IsNullOrEmpty(assetBundleName))
                {
                    // ассет из бандла
                    assetInfo.assetLoadType = AssetLoadType.AssetBundle;
                    assetInfo.location      = assetBundleName;
                }
                else
                {
                    int resourcesStartIndex = path.IndexOf(resources);
                    if (resourcesStartIndex != -1)
                    {
                        // ассет из ресурсов
                        assetInfo.assetLoadType = AssetLoadType.Resources;

                        string resourcesLoadPathWithExtension = path.Substring(resourcesStartIndex + resourcesLength);
                        int    extensionStartIndex            = resourcesLoadPathWithExtension.LastIndexOf(Char.Parse("."));
                        string resourcesLoadPath = resourcesLoadPathWithExtension;
                        if (extensionStartIndex != -1)
                        {
                            resourcesLoadPath = resourcesLoadPathWithExtension.Substring(0, extensionStartIndex);
                        }
                        assetInfo.location = resourcesLoadPath;
                    }
                    else
                    {
                        // ассет из проекта
                        assetInfo.assetLoadType = AssetLoadType.Project;
                        assetInfo.asset         = asset;
                    }
                }

                // для эдитора - добавить лучше вариант с генерацией базы для эдитора и для билда, где не будет этой лишней информации
                // грузить через бандлы в эдиторе неудобно, потому что они могут быть не сбилжены поэтому там сразу обращение к ассету происходит
                assetInfo.asset = asset;

                if (assetLabels.Length > 1)
                {
                    List <string> labels = new List <string>();
                    for (int k = 0; k < assetLabels.Length; k++)
                    {
                        if (assetLabels[k] != AssetLabelNames.DatabaseAsset)
                        {
                            labels.Add(assetLabels[k]);
                        }
                    }
                    assetInfo.assetLabels = labels.ToArray();
                }
                assetInfos.Add(assetInfo);
            }

            gameAssetsDatabase.assetInfos = assetInfos.ToArray();

            if (createNewDatabase)
            {
                AssetDatabase.CreateAsset(gameAssetsDatabase, defaultAssetPath);
            }
            else
            {
                EditorUtility.SetDirty(gameAssetsDatabase);
                AssetDatabase.SaveAssets();
            }
            LoadAssetDatabase();
        }