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