|
@@ -1,266 +0,0 @@
|
|
|
-using System;
|
|
|
-using System.Collections.Generic;
|
|
|
-using System.IO;
|
|
|
-using System.Linq;
|
|
|
-using System.Text;
|
|
|
-using System.Threading;
|
|
|
-using LLM.Editor.Analysis;
|
|
|
-using LLM.Editor.Helper;
|
|
|
-using UnityEditor;
|
|
|
-using UnityEditorInternal;
|
|
|
-using UnityEngine;
|
|
|
-
|
|
|
-namespace AssetBank.Editor
|
|
|
-{
|
|
|
- public class AssetBankScanner : EditorWindow
|
|
|
- {
|
|
|
- private List<string> folderToIgnore = new List<string>()
|
|
|
- {
|
|
|
- "AssetBank",
|
|
|
- "Library"
|
|
|
- };
|
|
|
-
|
|
|
- private List<string> fileExtensionToIgnore = new List<string>()
|
|
|
- {
|
|
|
- ".meta",
|
|
|
- ".dylib",
|
|
|
- ".bytes",
|
|
|
- ".dll"
|
|
|
- };
|
|
|
-
|
|
|
- private List<string> typesToIgnore = new List<string>()
|
|
|
- {
|
|
|
- typeof(DefaultAsset).ToString()
|
|
|
- };
|
|
|
-
|
|
|
- private int currentTab = 0;
|
|
|
- private string[] tabs = new[] { "General" , "Settings"};
|
|
|
-
|
|
|
- private readonly string folderstoignore = "AssetBankScanner_FolderToIgnore";
|
|
|
- private readonly string extensiontoignore = "AssetBankScanner_FileExtensionToIgnore";
|
|
|
- private readonly string typesToignore = "AssetBankScanner_TypesToIgnore";
|
|
|
- private readonly string CACHE_FOLDER = "AssetBank";
|
|
|
- private string cachePath;
|
|
|
-
|
|
|
- private List<ReorderableList> prefLists = new();
|
|
|
-
|
|
|
- private StringBuilder projectReport = new StringBuilder();
|
|
|
-
|
|
|
- [MenuItem("Window/Asset Database Scanner")]
|
|
|
- public static void ShowWindow()
|
|
|
- {
|
|
|
- var window = GetWindow<AssetBankScanner>();
|
|
|
- window.titleContent = new GUIContent("Asset Database Scanner");
|
|
|
- window.Show();
|
|
|
- }
|
|
|
-
|
|
|
- private void OnEnable()
|
|
|
- {
|
|
|
- cachePath = Path.Join("Library", CACHE_FOLDER);
|
|
|
- LoadSettings();
|
|
|
- SetupLists();
|
|
|
- }
|
|
|
-
|
|
|
- private void SetupLists()
|
|
|
- {
|
|
|
- prefLists.Add(CreateReorderableList("Folders to ignore", folderToIgnore));
|
|
|
- prefLists.Add(CreateReorderableList("Files to ignore", fileExtensionToIgnore));
|
|
|
- prefLists.Add(CreateReorderableList("Types to ignore", typesToIgnore));
|
|
|
- }
|
|
|
-
|
|
|
- private void LoadSettings()
|
|
|
- {
|
|
|
- if (!EditorPrefs.HasKey(folderstoignore))
|
|
|
- {
|
|
|
- EditorPrefs.SetString(folderstoignore, String.Join(";",folderToIgnore));
|
|
|
- }
|
|
|
-
|
|
|
- if (!EditorPrefs.HasKey(extensiontoignore))
|
|
|
- {
|
|
|
- EditorPrefs.SetString(extensiontoignore, String.Join(";", fileExtensionToIgnore));
|
|
|
- }
|
|
|
-
|
|
|
- if (!EditorPrefs.HasKey(typesToignore))
|
|
|
- {
|
|
|
- EditorPrefs.SetString(typesToignore, String.Join(";",typesToIgnore));
|
|
|
- }
|
|
|
-
|
|
|
- folderToIgnore = EditorPrefs.GetString(folderstoignore, "").Split(';')
|
|
|
- .Where(x => !string.IsNullOrWhiteSpace(x)).ToList();
|
|
|
- fileExtensionToIgnore = EditorPrefs.GetString(extensiontoignore, "").Split(';')
|
|
|
- .Where(x => !string.IsNullOrWhiteSpace(x)).ToList();
|
|
|
- typesToIgnore = EditorPrefs.GetString(typesToignore, "").Split(';').Where(x => !string.IsNullOrWhiteSpace(x)).ToList();
|
|
|
- }
|
|
|
-
|
|
|
- private void OnGUI()
|
|
|
- {
|
|
|
- EditorGUILayout.LabelField("Asset Bank Scanner", EditorStyles.boldLabel);
|
|
|
- GUILayout.Space(10);
|
|
|
-
|
|
|
- currentTab = GUILayout.Toolbar(currentTab, tabs);
|
|
|
- GUILayout.Space(10);
|
|
|
- switch (currentTab)
|
|
|
- {
|
|
|
- case 0: DrawScanner(); break;
|
|
|
- case 1: DrawSettings(); break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void DrawSettings()
|
|
|
- {
|
|
|
- GUILayout.Label("Settings", EditorStyles.boldLabel);
|
|
|
- foreach (var prefList in prefLists)
|
|
|
- {
|
|
|
- prefList.DoLayoutList();
|
|
|
- EditorGUILayout.Space();
|
|
|
- }
|
|
|
-
|
|
|
- if (GUILayout.Button("Clear cache"))
|
|
|
- {
|
|
|
- Directory.Delete(cachePath, true);
|
|
|
- }
|
|
|
- return;
|
|
|
- # region "Clear options"
|
|
|
- if (GUILayout.Button("Clear preferences", EditorStyles.miniButton))
|
|
|
- {
|
|
|
- prefLists.Clear();
|
|
|
- EditorPrefs.DeleteKey(folderstoignore);
|
|
|
- EditorPrefs.DeleteKey(extensiontoignore);
|
|
|
- EditorPrefs.DeleteKey(typesToignore);
|
|
|
- }
|
|
|
- #endregion
|
|
|
- }
|
|
|
-
|
|
|
- private ReorderableList CreateReorderableList(string title, List<string> targetList)
|
|
|
- {
|
|
|
- var list = new ReorderableList(targetList, typeof(string), true, true, true, true)
|
|
|
- {
|
|
|
- drawHeaderCallback = rect =>
|
|
|
- {
|
|
|
- EditorGUI.LabelField(rect, title);
|
|
|
- },
|
|
|
- drawElementCallback = (rect, index, isActive, isFocused) =>
|
|
|
- {
|
|
|
- targetList[index] = EditorGUI.TextField(
|
|
|
- new Rect(rect.x, rect.y + 2, rect.width, EditorGUIUtility.singleLineHeight),
|
|
|
- targetList[index]
|
|
|
- );
|
|
|
- },
|
|
|
- onAddCallback = l =>
|
|
|
- {
|
|
|
- targetList.Add("");
|
|
|
- },
|
|
|
- onRemoveCallback = l =>
|
|
|
- {
|
|
|
- targetList.RemoveAt(l.index);
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- return list;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- private void DrawScanner()
|
|
|
- {
|
|
|
- if (GUILayout.Button("Scan project", GUILayout.Height(25)))
|
|
|
- {
|
|
|
- ScanProject();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void ScanProject()
|
|
|
- {
|
|
|
- CreateMeta();
|
|
|
- SerializeProjectSettings();
|
|
|
- }
|
|
|
-
|
|
|
- private void SerializeProjectSettings()
|
|
|
- {
|
|
|
- // ProjectSettingsProvider _provider = new ProjectSettingsProvider();
|
|
|
- // var q = _provider.GetContext(null, "QualitySettings");
|
|
|
- //
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- private void CreateMeta()
|
|
|
- {
|
|
|
- float index = 0;
|
|
|
- var assetPaths = AssetDatabase.GetAllAssetPaths();
|
|
|
- int assetCount = assetPaths.Length;
|
|
|
-
|
|
|
- foreach (var assetPath in assetPaths)
|
|
|
- {
|
|
|
- var dataPath = Path.Join(cachePath, assetPath) + ".json";
|
|
|
- var metaPath = Path.Join(cachePath, assetPath) + ".meta" + ".json";
|
|
|
-
|
|
|
- var guid = AssetDatabase.AssetPathToGUID(assetPath);
|
|
|
-
|
|
|
- var progress = index / assetCount;
|
|
|
- index++;
|
|
|
- if (string.IsNullOrEmpty(guid))
|
|
|
- {
|
|
|
- Debug.LogWarning("Asset is invalid: " + assetPath);
|
|
|
- continue;
|
|
|
- }
|
|
|
- var extension = Path.GetExtension(assetPath);
|
|
|
-
|
|
|
- if (fileExtensionToIgnore.Contains(extension))
|
|
|
- {
|
|
|
- Debug.LogWarning("Asset file is not supported: " + assetPath);
|
|
|
- continue;
|
|
|
- }
|
|
|
- FileInfo info = new FileInfo(metaPath);
|
|
|
- if (info.Directory != null)
|
|
|
- {
|
|
|
- if (folderToIgnore.Contains(info.Directory.FullName))
|
|
|
- {
|
|
|
- Debug.Log("Ignoring directory: " + assetPath);
|
|
|
- continue;
|
|
|
- }
|
|
|
- info.Directory.Create();
|
|
|
- }
|
|
|
-
|
|
|
- AssetMetaData assetMetaData = new AssetMetaData
|
|
|
- {
|
|
|
- path = assetPath,
|
|
|
- guid = guid,
|
|
|
- dependencies = AssetDatabase.GetDependencies(assetPath)
|
|
|
- };
|
|
|
-
|
|
|
- if (EditorUtility.DisplayCancelableProgressBar("Updating", "Updating meta for file" + assetPath,
|
|
|
- progress))
|
|
|
- {
|
|
|
- return;
|
|
|
- }
|
|
|
- Thread.Sleep(1);
|
|
|
- var metaData = assetMetaData.ToJson();
|
|
|
- File.WriteAllText(metaPath, metaData);
|
|
|
- SerializeFile(assetPath, dataPath);
|
|
|
- }
|
|
|
- EditorUtility.ClearProgressBar();
|
|
|
- }
|
|
|
-
|
|
|
- private void SerializeFile(string path, string dataPath)
|
|
|
- {
|
|
|
- Type type = AssetDatabase.GetMainAssetTypeAtPath(path);
|
|
|
-
|
|
|
- // Looking at supporting types only
|
|
|
- if (type != typeof(GameObject) && type != typeof(Texture) && type != typeof(Material) &&
|
|
|
- type != typeof(Shader) && type != typeof(Font) && type != typeof(PlayerSettings) &&
|
|
|
- type != typeof(Animation) && type != typeof(Material) &&
|
|
|
- type != typeof(PrefabAssetType) && type != typeof(TextAsset) && type != typeof(AudioClip) &&
|
|
|
- type != typeof(SceneAsset) && type != typeof(MonoScript) &&
|
|
|
- type != typeof(ScriptableObject))
|
|
|
- {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- AssetDatabase.LoadAssetAtPath(path, type);
|
|
|
- AssetData assetData = new AssetData();
|
|
|
-
|
|
|
- // TODO: Serialization for asset types
|
|
|
- var jsonifiedAsset = assetData.ToJson();
|
|
|
- File.WriteAllText(dataPath, jsonifiedAsset);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|