|
@@ -0,0 +1,256 @@
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.IO;
|
|
|
+using System.Linq;
|
|
|
+using System.Threading;
|
|
|
+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"
|
|
|
+ };
|
|
|
+
|
|
|
+ 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();
|
|
|
+
|
|
|
+ [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", EditorStyles.miniButton))
|
|
|
+ {
|
|
|
+ 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()
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ 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
|
|
|
+ };
|
|
|
+
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ AssetData assetData = new AssetData();
|
|
|
+
|
|
|
+ // TODO: Serialization for asset types
|
|
|
+ var jsonifiedAsset = assetData.ToJson();
|
|
|
+ File.WriteAllText(dataPath, jsonifiedAsset);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|