ReferenceCollector.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using Object = UnityEngine.Object;
  5. #if UNITY_EDITOR
  6. using UnityEditor;
  7. #endif
  8. [Serializable]
  9. public class ReferenceCollectorData
  10. {
  11. public string key;
  12. public Object gameObject;
  13. }
  14. public class ReferenceCollector : MonoBehaviour, ISerializationCallbackReceiver
  15. {
  16. public List<ReferenceCollectorData> data = new List<ReferenceCollectorData>();
  17. private readonly Dictionary<string, Object> dict = new Dictionary<string, Object>();
  18. #if UNITY_EDITOR
  19. public void Add(string key, Object obj)
  20. {
  21. SerializedObject serializedObject = new SerializedObject(this);
  22. var dataProperty = serializedObject.FindProperty("data");
  23. int i;
  24. for (i = 0; i < data.Count; i++)
  25. {
  26. if (data[i].key == key)
  27. {
  28. break;
  29. }
  30. }
  31. if (i != data.Count)
  32. {
  33. var element = dataProperty.GetArrayElementAtIndex(i);
  34. element.FindPropertyRelative("gameObject").objectReferenceValue = obj;
  35. }
  36. else
  37. {
  38. dataProperty.InsertArrayElementAtIndex(i);
  39. var element = dataProperty.GetArrayElementAtIndex(i);
  40. element.FindPropertyRelative("key").stringValue = key;
  41. element.FindPropertyRelative("gameObject").objectReferenceValue = obj;
  42. }
  43. serializedObject.ApplyModifiedProperties();
  44. serializedObject.UpdateIfDirtyOrScript();
  45. }
  46. public void Remove(string key)
  47. {
  48. SerializedObject serializedObject = new SerializedObject(this);
  49. var dataProperty = serializedObject.FindProperty("data");
  50. int i;
  51. for (i = 0; i < data.Count; i++)
  52. {
  53. if (data[i].key == key)
  54. {
  55. break;
  56. }
  57. }
  58. if (i != data.Count)
  59. {
  60. dataProperty.DeleteArrayElementAtIndex(i);
  61. }
  62. EditorUtility.SetDirty(this);
  63. serializedObject.ApplyModifiedProperties();
  64. serializedObject.UpdateIfDirtyOrScript();
  65. }
  66. public class ReferenceCollectorDataComparer : IComparer<ReferenceCollectorData>
  67. {
  68. public int Compare(ReferenceCollectorData x, ReferenceCollectorData y)
  69. {
  70. return String.Compare(x.key, y.key, StringComparison.Ordinal);
  71. }
  72. }
  73. public void Sort()
  74. {
  75. SerializedObject serializedObject = new SerializedObject(this);
  76. data.Sort(new ReferenceCollectorDataComparer());
  77. EditorUtility.SetDirty(this);
  78. serializedObject.ApplyModifiedProperties();
  79. serializedObject.UpdateIfDirtyOrScript();
  80. }
  81. #endif
  82. public T Get<T>(string key) where T : class
  83. {
  84. Object dictGo;
  85. if (!dict.TryGetValue(key, out dictGo))
  86. {
  87. return null;
  88. }
  89. return dictGo as T;
  90. }
  91. public void OnBeforeSerialize()
  92. {
  93. }
  94. public void OnAfterDeserialize()
  95. {
  96. dict.Clear();
  97. foreach (var referenceCollectorData in data)
  98. {
  99. if (!dict.ContainsKey(referenceCollectorData.key))
  100. {
  101. dict.Add(referenceCollectorData.key, referenceCollectorData.gameObject);
  102. }
  103. }
  104. }
  105. }