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

GenericScriptablePathInspector.cs 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEditor;
  6. using UnityEditor.EditorTools;
  7. namespace UnityEditor.U2D.Path
  8. {
  9. public class GenericScriptablePathInspector<U,T> : ScriptablePathInspector where U : ScriptableData<T>
  10. {
  11. private List<U> m_DataObjects = new List<U>();
  12. private List<U> m_SelectedDataObjects = new List<U>();
  13. private Editor m_CachedEditor = null;
  14. private void OnEnable()
  15. {
  16. PrepareDataObjects();
  17. }
  18. private void OnDestroy()
  19. {
  20. DestroyDataObjects();
  21. }
  22. public override void OnInspectorGUI()
  23. {
  24. base.OnInspectorGUI();
  25. DoCustomDataInspector();
  26. }
  27. protected void DoCustomDataInspector()
  28. {
  29. PrepareDataObjects();
  30. if (m_SelectedDataObjects.Count > 0)
  31. {
  32. CreateCachedEditor(m_SelectedDataObjects.ToArray(), null, ref m_CachedEditor);
  33. EditorGUI.BeginChangeCheck();
  34. m_CachedEditor.OnInspectorGUI();
  35. if (EditorGUI.EndChangeCheck())
  36. SetDataObjects();
  37. }
  38. }
  39. private void PrepareDataObjects()
  40. {
  41. var elementCount = 0;
  42. m_SelectedDataObjects.Clear();
  43. foreach(var path in paths)
  44. elementCount += path.pointCount;
  45. while (m_DataObjects.Count < elementCount)
  46. CreateDataObject();
  47. var index = 0;
  48. foreach(var path in paths)
  49. {
  50. var genericPath = path as GenericScriptablePath<T>;
  51. var customDataArray = genericPath.data;
  52. var length = customDataArray.Length;
  53. for (var i = 0; i < length; ++i)
  54. {
  55. var dataObject = m_DataObjects[index + i];
  56. dataObject.data = customDataArray[i];
  57. if (path.selection.Contains(i))
  58. {
  59. dataObject.owner = path.owner;
  60. dataObject.index = i;
  61. m_SelectedDataObjects.Add(dataObject);
  62. }
  63. }
  64. index += length;
  65. }
  66. }
  67. private void SetDataObjects()
  68. {
  69. var index = 0;
  70. foreach(var path in paths)
  71. {
  72. var genericPath = path as GenericScriptablePath<T>;
  73. var customDataArray = genericPath.data;
  74. var length = customDataArray.Length;
  75. for (var i = 0; i < length; ++i)
  76. customDataArray[i] = m_DataObjects[index + i].data;
  77. genericPath.data = customDataArray;
  78. index += length;
  79. }
  80. }
  81. private U CreateDataObject()
  82. {
  83. var dataObject = ScriptableObject.CreateInstance<U>();
  84. dataObject.hideFlags = HideFlags.HideAndDontSave;
  85. m_DataObjects.Add(dataObject);
  86. return dataObject;
  87. }
  88. private void DestroyDataObjects()
  89. {
  90. foreach (var customDataObject in m_DataObjects)
  91. DestroyImmediate(customDataObject);
  92. m_DataObjects.Clear();
  93. m_SelectedDataObjects.Clear();
  94. }
  95. }
  96. }