暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

SearcherDatabaseBase.cs 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using JetBrains.Annotations;
  5. using UnityEngine;
  6. namespace UnityEditor.Searcher
  7. {
  8. [PublicAPI]
  9. public abstract class SearcherDatabaseBase
  10. {
  11. protected const string k_SerializedJsonFile = "/SerializedDatabase.json";
  12. public string DatabaseDirectory { get; set; }
  13. public IList<SearcherItem> ItemList => m_ItemList;
  14. // ReSharper disable once Unity.RedundantSerializeFieldAttribute
  15. [SerializeField]
  16. protected List<SearcherItem> m_ItemList;
  17. protected SearcherDatabaseBase(string databaseDirectory)
  18. {
  19. DatabaseDirectory = databaseDirectory;
  20. }
  21. public virtual void BuildIndex() { }
  22. public abstract List<SearcherItem> Search(string query, out float localMaxScore);
  23. internal void OverwriteId(int newId)
  24. {
  25. Id = newId;
  26. }
  27. internal int Id { get; private set; }
  28. protected void LoadFromFile()
  29. {
  30. var reader = new StreamReader(DatabaseDirectory + k_SerializedJsonFile);
  31. var serializedData = reader.ReadToEnd();
  32. reader.Close();
  33. EditorJsonUtility.FromJsonOverwrite(serializedData, this);
  34. foreach (var item in m_ItemList)
  35. {
  36. item.OverwriteDatabase(this);
  37. item.ReInitAfterLoadFromFile();
  38. }
  39. }
  40. protected void SerializeToFile()
  41. {
  42. if (DatabaseDirectory == null)
  43. return;
  44. var serializedData = EditorJsonUtility.ToJson(this, true);
  45. var writer = new StreamWriter(DatabaseDirectory + k_SerializedJsonFile, false);
  46. writer.Write(serializedData);
  47. writer.Close();
  48. }
  49. protected void AddItemToIndex(SearcherItem item, ref int lastId, Action<SearcherItem> action)
  50. {
  51. m_ItemList.Insert(lastId, item);
  52. // We can only set the id here as we only know the final index of the item here.
  53. item.OverwriteId(lastId);
  54. item.GeneratePath();
  55. action?.Invoke(item);
  56. lastId++;
  57. // This is used for sorting results between databases.
  58. item.OverwriteDatabase(this);
  59. if (!item.HasChildren)
  60. return;
  61. var childrenIds = new List<int>();
  62. foreach (SearcherItem child in item.Children)
  63. {
  64. AddItemToIndex(child, ref lastId, action);
  65. childrenIds.Add(child.Id);
  66. }
  67. item.OverwriteChildrenIds(childrenIds);
  68. }
  69. }
  70. }